MySQL:count(*),count(1),count(col)效率比较
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不是每条直接运行十次,是运行第一条再运行第二条的,保持时效性。
结果如下:
结果: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)效率比较
-
MySQL中distinct和count(*)的使用方法比较
-
MySQL中distinct和count(*)的使用方法比较
-
MySQL 中的count(*) 与 count(1) 谁更快一些?
-
MySQL 中的count(*) 与 count(1) 谁更快一些?
-
MYSQL:SQL_CALC_FOUND_ROWS和count(*)性能比较_MySQL
-
Mysql优化之select count效率_MySQL
-
Mysql count 的多种使用方式性能比较
-
mysql_num_rows VS COUNT 效率问题分析
-
MySQL中count(*)、count(1)和count(col)的区别汇总