MySql-count(*)与count(id)与count(字段)之间的执行结果和性能分析
在mysql数据库中,当我们需要统计数据的时候,一定会用到count()这个方法,那么count(值)里面的这个值,到底应该怎么选择呢!常见有3种选择,(*,数字,列名),分别列出它们的执行结果和性能对比。
执行效果:
count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL
count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是指空字符串或者0,而是null)的计数,即某个字段值为NULL时,不统计。
测试结果:
1 CREATE TABLE `test_count` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `phone` varchar(11) DEFAULT NULL, 4 `nick_name` varchar(50) DEFAULT NULL, 5 `username` varchar(50) DEFAULT NULL, 6 `password` varchar(50) DEFAULT NULL, 7 `gender` tinyint(1) DEFAULT NULL, 8 `is_del` tinyint(1) DEFAULT NULL, 9 PRIMARY KEY (`id`), 10 KEY `index_username` (`username`) USING BTREE 11 ) ENGINE=InnoDB AUTO_INCREMENT=17805 DEFAULT CHARSET=utf8;
1 [SQL] SELECT COUNT(*) FROM test_count; 2 受影响的行: 0 3 时间: 0.828ms 4 5 [SQL] 6 SELECT COUNT(1) FROM test_count; 7 受影响的行: 0 8 时间: 0.827ms 9 10 [SQL] 11 SELECT COUNT(id) FROM test_count; 12 受影响的行: 0 13 时间: 0.873ms 14 15 [SQL] 16 SELECT COUNT(username) FROM test_count; 17 受影响的行: 0 18 时间: 0.981ms 19 20 [SQL] 21 SELECT COUNT(nick_name) FROM test_count; 22 受影响的行: 0 23 时间: 7.673ms
在100W+数据下,count(*)和count(1)差距微乎其微,但两者效率大于count(id),count(id)效率明显大于count(column),带索引的count(column)明显效率高于不带索引的。
最终结论:
count(1) > count(*) > count(主键id) > count(带索引column) > count(不带索引column),count(1)效率稍微高于count(*),但差距微乎其微。