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(*),但差距微乎其微。

原文地址:https://www.cnblogs.com/firstlady/p/10522241.html