Mysql的count函數用于統計符合條件的記錄數,常用的方式有:
1、count(*)
2、count(1)
3、count(id)
4、count(col)
首先需要明确一點:count函數對于傳回的結果集,一行行地判斷,不會統計null值。
初學者經常會糾結到底應該使用哪種方式做計數,實際上這四種計數方式是有很大差别的。
count()的原理:
-
count(*)
周遊整張表,不需要取出資料來計算,直接按行累計。
-
count(1)
周遊整張表,不需要取數,按行計數。
-
count(id)
周遊整張表,取出id,按行計數。
-
count(col)
周遊整張表,取出col,如果字段定義不為null,取出col之後,按行計數。如果字段定義可以為null,循環對col進行判斷是否為null值,再計數。
這四種計數方式周遊整張表的方式也有不同:
-
count(*)
會找任意較小的索引周遊,如果沒有二級索引,就會直接周遊主鍵索引,因為主鍵索引包含了全表資料,是以在字段比較大的時候,可能會需要頻繁去磁盤取資料,導緻count() 效率低,耗時長,結局方案是給一個小字段加個二級索引,這樣count() 的時候就會周遊這個二級索引,快速進行計數。
-
count(1)
使用索引周遊的選擇和 count(*)一緻。
-
count(id)
使用主鍵索引周遊
-
count(col)
如果col建立了二級索引,則會周遊二級索引,否則主鍵索引
是以,性能上排序為:count(*) > count(1) > count(id) > count(col)。
在不考慮是否對null計數得差別的前提下,性能優化的方向,除了使用count(*) 外,就是适當使用小的二級索引。