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