SQL优化之count(*),count(列)
一、count各种用法的区别
1、count函数是日常工作中最常用的函数之一,用来统计表中数据的总数,常用的有count(*),count(1),count(列)。count(*)和count(1)是用来统计表中共有多少数据。是针对全表的
SELECT COUNT(*) FROM TAB1;
SELECT COUNT(1) FROM TAB1;
SELECT COUNT(*) FROM TAB1, TAB2; #显示两表做笛卡尔积后的行数
2、count(列)是针对于某一列的,如果此列值为空的话,count(列)是不会统计这一行的。NULL不会算在行数统计之内
CREATE TABLE T1(I int);
INSERT INTO T1 VALUES(1),(2),(NULL);
SELECT COUNT(*) FROM T1; # 结果为3
SELECT COUNT(*) FROM T1; # 结果为2
二、关于count的用法,谁更快
1、由上文可知,在数据库中count(*)和count(列)根本就是不等价的,count(*)是针对于全表的,而count(列)是针对于某一列的,如果此列值为空的话,count(列)是不会统计这一行的
所以两者根本没有可比性,性能比较首先要考虑写法等价,这两个语句根本就不等价的。也没有比较的意义。
2、建一张有25个字段的表并加入数据在进行count(*)和count(列)比较,分别执行count(*)和count每一列的操作来看一下谁更快。结果如下:

结论:列的偏移量决定性能,列越靠后,访问的开销越大。由于count(*)的算法与列偏移量无关,所以count(*) 最快,count( 最后列) 最慢所以:在设计表结构的过程中,越常用到的 列,要放在表结构的前边,不常用的列,放在表结构的后边。在工作中根据实际业务再考虑应该使用count(*)还是count(列)
PS: conut(1)和count(*)是一样的。但是在informix数据库中,对count(*)做过算法优化,远远快于count(1)。
三、关于SQL优化的一些误区
1、在联合查询中,和表的连接顺序无关。有人认为数据库的解析器是按顺序扫描from字句中的表名。应该选择小表作为基础表优先扫描(ps:如果现在的小表随着业务量的提升变成大表了,岂 不是要经常修改应用)。所以这种说法是不成立的,在联合查询中,以下的两种写法是没有区别的
T1(2条数据)
T2(1万条数据)
SELECT COUNT(*) FROM T1, T2;
SELECT COUNT(*) FROM T2, T1;
2、和where字句的连接顺序也无关。数据库在解析where字句时,也是按顺序解析(oracle是自下而上)。有些人认为where子句中排在最后的表应该是返回数据量少的表。这种说法也是不成立的
如:从T1表查到的数据比较少或该表的条件比较确定。
SELECT * FROM T1,T2 WHRE T1.A > 10 AND T2.B = 20;
SELECT * FROM T1,T2 WHRE T2.B = 20 AND T1.A > 10;
如果T2表返回数据量大,第二条SQL比第一条快(不成立)
3、用not exists取代not in是没有依据的(在oracle11g中都是采用高效的anti反连接算法)
SQL优化之count(*),count(列)的更多相关文章
- SQL优化之SELECT COUNT(*)
前言 SQL优化之SQL 进阶技巧(上) SQL优化之SQL 进阶技巧(下)中提到使用以下 sql 会导致慢查询 SELECT COUNT(*) FROM SomeTable SELECT COUNT ...
- SQL优化之SQL 进阶技巧(下)
上文( SQL优化之SQL 进阶技巧(上) )我们简述了 SQL 的一些进阶技巧,一些朋友觉得不过瘾,我们继续来下篇,再送你 10 个技巧 一. 使用延迟查询优化 limit [offset], [r ...
- SQL优化之SQL 进阶技巧(上)
由于工作需要,最近做了很多 BI 取数的工作,需要用到一些比较高级的 SQL 技巧,总结了一下工作中用到的一些比较骚的进阶技巧,特此记录一下,以方便自己查阅,主要目录如下: SQL 的书写规范 SQL ...
- 6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化
1组函数 avg(),sum(),max(),min(),count()案例: selectavg(sal),sum(sal),max(sal),min(sal),count(sal) from ...
- 从多表连接后的select count(*)看待SQL优化
从多表连接后的select count(*)看待SQL优化 一朋友问我,以下这SQL能直接改写成select count(*) from a吗? SELECT COUNT(*) FROM a LEFT ...
- 关于数据库优化1——关于count(1),count(*),和count(列名)的区别,和关于表中字段顺序的问题
1.关于count(1),count(*),和count(列名)的区别 相信大家总是在工作中,或者是学习中对于count()的到底怎么用更快.一直有很大的疑问,有的人说count(*)更快,也有的人说 ...
- 慕课网 性能优化之MySQL优化--- max 和count的性能优化
注:在执行SQL语句前加上explain可以查看MySQL的执行计划 数据库:MySQL官方提供的sakila数据库 Max优化: 例如:查询最后支付时间 explain select max(pay ...
- SQL中AVG、COUNT、SUM、MAX等聚合函数对NULL值的处理
一.AVG() 求平均值注意AVE()忽略NULL值,而不是将其作为“0”参与计算 二.COUNT() 两种用法 1.COUNT(*) 对表中行数进行计数不管是否有NULL 2.COUNT(字段名) ...
- SQL语句中count(1)count(*)count(字段)用法的区别
SQL语句中count(1)count(*)count(字段)用法的区别 在SQL语句中count函数是最常用的函数之一,count函数是用来统计表中记录数的一个函数, 一. count(1)和cou ...
随机推荐
- redis 基础应用
redis 安装 -redis安装 -window的安装 -redis支持5大数据类型 -字符 Memcached 只支持字符串类型 -列表 -字典 -集合 -有序集合 面试题:游戏 ...
- sql 按字段指定值排序
这个需要在排序语句中使用条件判断 例如:表[Table_temp]中列[col1]为字符,属性为varchar(10),排序时需要按照B.A.C的顺序显示,则可按照以下SQL语句: select * ...
- 16 多校 8 Ball (贪心排序)很巧妙的思路啊~
ZZX has a sequence of boxes numbered 1,2,...,n1,2,...,n. Each box can contain at most one ball. You ...
- MySQL笔记(2)
SQL 的约束 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性.. 1 约束分类 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性. ...
- Spring Boot 揭秘与实战(二) 数据存储篇 - MyBatis整合
文章目录 1. 环境依赖 2. 数据源3. 脚本初始化 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 4. MyBatis整合5. 总结 4.1. 方案一 通过 ...
- 内置变量WEBGL
gl_FragCoord是片元着色器中的只读变量,它保存了片元相对窗口的坐标位置:x, y, z, 1/w.这个值是顶点处理产生片元后固定功能内插图元的结果.组件z是用于表示片元深度的深度值. gl_ ...
- C高级第三次作业
C高级第三次作业(1) 6-1 输出月份英文名 1.设计思路 (1)算法: 第一步:定义整型变量n,字符指针s,输入一个数赋给n. 第二步:调用函数getmonth将值赋给s. 第三步:在函数getm ...
- 【leetcode】7-ReverseInteger
problem: Reverse Integer 注意考虑是否越界: INT_MAX INT_MIN 32bits or 64bits 调整策略,先从简单的问题开始:
- NHibernate many-to-one映射
many-to-one 数据方面,多条对一条. 非主键字段与主键字段的关联,在类中实现了一对一的单向映射.在类中是单实体映射. 订单充值业务.显然,一单位可以有多个充值信息. 通过表 Deposit里 ...
- [LeetCode&Python] Problem 350. Intersection of Two Arrays II
Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1 ...