相信你们老是在工做中,或者是学习中对于count()的到底怎么用更快。一直有很大的疑问,有的人说count(*)更快,也有的人说count(列名)更快,那究竟是谁更快,我将会在本文中详细介绍一下究竟是count(1),count(*)和count(列明)的区别,和更适合的使用场景。 html
往常在工做中有人会说count(1)比count(*)会快,或者相反,首先这个结论确定是错的,实际上count(1)和count(*)并无区别。算法
接下来,咱们来对比一下count(*)和count(列)到底谁更快一些sql
首先咱们执行如下sql,来看一下执行效率(下面sql针对的是ORACLE数据库,大体逻辑为先删除t别,而后在根据dba_objects建立t表,在更新t表根据rownum)数据库
1 drop table t purge; 2 create table t as select * from dba_objects; 3 --alter table T modify object_id null; 4 update t set object_id =rownum ; 5 set timing on 6 set linesize 1000 7 set autotrace on --开启跟踪 8 9 select count(*) from t; 10 / 11 select count(object_id) from t; 12 /
而后我们分别看一下“select count(*) from t”和“select count(object_id) from t”语句的执行计划。(执行计划是指sql的一个执行顺序和耗费的资源,耗费的资源越少越快,若是在plsql中,使用F8能够查看sql的执行计划)性能
经过咱们执行sql的实验来讲,count(*)和count(列)消耗的资源是同样的,说面他们是同样快的,可是真的是这样么。那么我们接着如下的实验。学习
此次我们给object_id这一列加一个索引试一下。咱们执行一下索引sql优化
1 create index idx_object_id on t(object_id); 2 select count(*) from t; 3 / 4 5 6 select count(object_id) from t; 7 /
而后咱们在分别看一下两条sql的执行计划spa
经过咱们建完索引后。忽然发现count(列)变快了好多,可是count(*)仍是和之前同样的。这说明了count(列)能够用到索引,而count(*)不行,可是真的这样么,我们在往下看。设计
接下来咱们给object_id这个字段加上不可为空条件。咱们执行如下sqlexcel
1 create index idx_object_id on t(object_id); 2 select count(*) from t; 3 / 4 5 6 select count(object_id) from t; 7 /
接下来咱们在来看一下count(*)的执行计划
如今count(*)和count(列)同样快了,由此咱们得出了这个结论:count(列)和count(*)其实同样快,若是索引列是非空的,count(*)可用到索引,此时同样快。
总结:可是真的结论是这样的么。其实否则。其实在数据库中count(*)和count(列)根本就是不等价的,count(*)是针对于全表的,而count(列)是针对于某一列的,若是此列值为空的话,count(列)是不会统计这一行的。因此二者根本没有可比性,性能比较首先要考虑写法等价,这两个语句根本就不等价。也就失去了去比较的意义!!!
首先咱们建一张有25个字段的表并加入数据在进行count(*)和count(列)比较。因为建表语句和插入语句和上面雷同。就不贴出代码了。
而后咱们分别执行count(*)和count每一列的操做来看一下到底谁更快一些,因为执行计划太多,就不一一贴图了。我整理了一个excel来给你们看一下执行的结果
通过实验咱们看出,count(列)越日后。咱们的执行效率越慢。因此,咱们得出如下结论:
1.列的偏移量决定性能,列越靠后,访问的开销越大。
2.因为count(*)的算法与列偏移量无关,因此count(*)最快。
总结:因此咱们在开发设计中。越经常使用的列,要放在靠前的位置。而cout(*)和count(列)是两个不等价的用法,因此没法比较哪一个性能更好,在实际的sql优化场景中要根据当时的业务场景再去考虑是使用count(*)仍是count(列)(其中的区别上文有提到)。
如下内容来自我的总结:
1.数据库中只有一个字段:count(*)快
2.数据库中有索引: