欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL:count(*),count(1),count(col)效率比较

程序员文章站 2024-03-20 22:40:10
...

    count(1)效率高于count(*)这个理论以前就直接印在脑子里,之前做了一个百万数据插入MySQL的测试,想着有这么多数据,就粗略地测试一下。

  结果:count(img) > count(del_flag) > count(name) > count(id) > count(1)=count(*) > count(status)=count(start_time)

img:varchar(255)

del_flag:char(1)

name:varchar(255)索引

id:int(11)主键

status:tinyint(4)

start_time:datetime

 

上面是测试字段的信息

下面是测试的sql

select count(1) from t_product;

select count(*) from t_product;

select count(`id`) from t_product;

select count(`name`) from t_product;

select count(`status`) from t_product;

select count(`img`) from t_product;

-- 带条件----------------------------------
select count(1) from t_product where `name` like '数据%';

select count(*) from t_product where `name` like '数据%';

select count(`id`) from t_product where `name` like '数据%';

select count(`name`) from t_product where `name` like '数据%';

select count(`status`) from t_product where `name` like '数据%';

select count(`img`) from t_product where `name` like '数据%';

这些sql不是每条直接运行十次,是运行第一条再运行第二条的,保持时效性。

结果如下:

MySQL:count(*),count(1),count(col)效率比较

结果:count(img) > count(del_flag) > count(name) > count(id) > count(1)=count(*) > count(status)=count(start_time)

图片中上半部分是不带条件的,下半部分是带条件的。

结论:

1、count(*)和count(1)效率可以说是一样的。

2、count(主键)效率再高于count(加了索引的列名),count(列名)效率再低一点,如果那列离的越远的话,其实效率是会更低的。

这里只看效率,count(1),count(*),count(主键)是能把所有数据都统计出来的,如果count(name)中name字段有空的话,那会统计的不包括空的行。

例如:表中有10条数据,name中有两条是空的,那么count(name)出来的就是8。

 

问题:其实大家看上面的图和结果也能看出来,status是tinyint类型,start_time是datetime类型,count这两个字段反而效率是最高的。我在网上也没找到相应的解释,这两个字段没加索引,类型确实也很小,那char类型的字段和主键为什么还比他们慢这么多,有知道请指教一下。

 

 

-----------------------------------------------------------------------------------------------------------------------------------------

上面的数据是用innodb存储引擎测试的,后面我又用了myisam引擎来测试,发现查询效率有明显的提升!

每个结果提升的平均值大概在1.3-1.5秒之间,因为是突然的想法,运行也不止十次,所以没有作图统计,结果排序还是和上面的一样。

innodb引擎做的事情比myisam引擎更多更全面,而且内部的统计方式也是不一样的,如果数据量还大,效率明显就出来了。

个人建议:

在实际开发中并没有说哪个一定是最好的选择,这个要看各个方面的因素综合判断。

1)表的数据量大,而且需要经常查询,推荐使用MYISAM。

2)表的数据经常变动,为了数据安全性,推荐INNODB。

 

参考:COUNT(*) for Innodb Tables:https://www.percona.com/blog/2006/12/01/count-for-innodb-tables/

 MyISAM和InnoDB 简单总结:https://www.cnblogs.com/kevingrace/p/5685355.html

 

数据库:MySQL 5.7

数据量:2400011条

电脑:

MySQL:count(*),count(1),count(col)效率比较