一、count(*)和count(1)查询速度
使用count函数,当要统计的数量比较大时,发现count(*)花费的时间比较多,相对来说count(1)花费的时间比较少。
1、如果你的数据表没有主键,那么count(1)比count(*)快 ;如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快 。
2、如果你的表只有一个字段的话那count(*)就是最快的。
3、如果count(1)是聚索引,id,那肯定是count(1)快,但是差的很小的。因为count(*),自动会优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化。此时count(1)和count(*)基本没有区别!
二、count(*) 和count(列名) 两者查询差异的原因分析
在数据记录都不为空的时候查询出来结果上没有差别的.
count(*)(是针对全表)将返回表格中所有存在的行的总数包括值为null的行;
count(列名)(是针对某一列)将返回表格中某一列除去null以外的所有行的总数。
三、引申
distinct 列名,得到的结果将是除去值为null和重复数据后的结果
四、count(1)、count(*)、count(列名)的含义、区别、执行效率
先说结论:count(*) ≈ count(1) > count(id) > count(字段)
含义:
1、count() :统计所有的行数,包括为null的行(COUNT()不单会进行全表扫描,也会对表的每个字段进行扫描。而COUNT(‘x’)或者COUNT(COLUMN)或者COUNT(0)等则只进行一个字段的全表扫描)。
2、count(1):计算一共有多少符合条件的行,不会忽略null值(其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1…同理,count(2),也可以,得到的值完全一样,count(‘x’),count(‘y’)都是可以的。count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。)
3、count(列名):查询列名那一列的,字段为null不统计(这里的空不是指空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。
执行效果:
1、count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL。
2、count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL。
3、count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空。
执行效率:
列名为主键,count(列名)会比count(1)快
列名不为主键,count(1)会比count(列名)快
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
如果有主键,则 select count(主键)的执行效率是最优的
如果表只有一个字段,则 select count(*)最优
五、关于count(1),count(*),和count(列名)的区别
1、在数据库中count(*)和count(列)根本就是不等价的,count(*)是针对于全表的,而count(列)是针对于某一列的,如果此列值为空的话,count(列)是不会统计这一行的。所以两者根本没有可比性,性能比较首先要考虑写法等价,这两个语句根本就不等价。也就失去了去比较的意义!!!
2、关于表中字段顺序的问题
1)列的偏移量决定性能,列越靠后,访问的开销越大。
2)由于count(*)的算法与列偏移量无关,所以count(*)最快。
总结:所以我们在开发设计中。越常用的列,要放在靠前的位置。而cout(*)和count(列)是两个不等价的用法,所以无法比较哪个性能更好,在实际的sql优化场景中要根据当时的业务场景再去考虑是使用count(*)还是count(列)
另外的观点:Select count(*)、Count(1)、Count(0)的区别和执行效率比较
结论:
- count(*)和count(1)执行的效率是完全一样的。
- count(*)的执行效率比count(col)高,因此可以用count(*)的时候就不要去用count(col)。
- count(col)的执行效率比count(distinct col)高,不过这个结论的意义不大,这两种方法也是看需要去用。
- 如果是对特定的列做count的话建立这个列的非聚集索引能对count有很大的帮助。
- 如果经常count(*)的话则可以找一个最小的col建立非聚集索引以避免全表扫描而影响整体性能。
- 在不加WHERE限制条件的情况下,COUNT(*)与COUNT(COL)基本可以认为是等价的;
但是在有WHERE限制条件的情况下,COUNT(*)会比COUNT(COL)快非常多; -
count(0)=count(1)=count(*)
1. count(指定的有效值)--执行计划都会转化为count(*)2. 如果指定的是列名,会判断是否有null,null不计算
当然,在建立优化count的索引之前一定要考虑新建立的索引会不会对别的查询有影响,影响有多大,要充分考虑之后再决定是否要这个索引,这是很重要的一点,不要捡了芝麻丢了西瓜。
另外的观点2:执行count(1)、count(*) 与 count(列名) 到底有什么区别?
一、语义不同
count(1):表示统计查询结果的行数,不考虑表中的任何列的值,只关心是否存在行。count(*):表示统计查询结果的行数,与count(1)类似,不考虑表中的任何列的值,只关心是否存在行。count(列名):表示统计指定列的非空值的数量,只统计指定列中不为NULL的行。
二、性能差异
count(1)和count(*):这两种写法在大多数数据库系统中的性能是相同的,因为它们都不关心具体的列值,只关心行的存在与否。count(列名):这种写法在某些数据库系统中可能会比count(1)和count(*)性能稍差,因为它需要检查指定列的值是否为NULL,并排除NULL值的行。
三、对空值的处理不同
count(1)和count(*):不关心表中的具体列值,因此不受空值影响,会将包含NULL值的行也计算在内。count(列名):只统计指定列的非空值,会排除包含NULL值的行,只计算指定列中不为NULL的行
四、使用范围不同
count(1)和count(*):适用于查询整个表或满足特定条件的行数。count(列名):适用于统计特定列的非空值数量。
五、结果集不同
count(1)和count(*):返回的结果集只有一行一列,即表示查询结果的行数。count(列名):返回的结果集只有一行一列,即表示指定列的非空值数量。
六、可读性不同
count(1):语义上不够明确,不容易理解其作用。count(*):语义明确,表示统计行数。count(列名):语义明确,表示统计指定列的非空值数量。
延伸阅读
COUNT(*)是什么
COUNT(*) 是一种数据库查询语句,用于统计某个表中的记录数或满足指定条件的记录数。它返回一个表示记录数量的整数值。使用 COUNT() 时,数据库引擎会对指定的表进行扫描,并计算符合条件的记录数量。 表示选择所有的列,而不是特定的列名。因此,COUNT(*) 将统计整个表中的记录数,无论具体的列值是什么。