天天看點

Mysql count 的多種使用方式性能比較

Mysql的count函數用于統計符合條件的記錄數,常用的方式有:

1、count(*)
2、count(1)
3、count(id)
4、count(col)
           

首先需要明确一點:count函數對于傳回的結果集,一行行地判斷,不會統計null值。

初學者經常會糾結到底應該使用哪種方式做計數,實際上這四種計數方式是有很大差别的。

count()的原理:

  1. count(*)

    周遊整張表,不需要取出資料來計算,直接按行累計。

  2. count(1)

    周遊整張表,不需要取數,按行計數。

  3. count(id)

    周遊整張表,取出id,按行計數。

  4. count(col)

    周遊整張表,取出col,如果字段定義不為null,取出col之後,按行計數。如果字段定義可以為null,循環對col進行判斷是否為null值,再計數。

這四種計數方式周遊整張表的方式也有不同:

  1. count(*)

    會找任意較小的索引周遊,如果沒有二級索引,就會直接周遊主鍵索引,因為主鍵索引包含了全表資料,是以在字段比較大的時候,可能會需要頻繁去磁盤取資料,導緻count() 效率低,耗時長,結局方案是給一個小字段加個二級索引,這樣count() 的時候就會周遊這個二級索引,快速進行計數。

  2. count(1)

    使用索引周遊的選擇和 count(*)一緻。

  3. count(id)

    使用主鍵索引周遊

  4. count(col)

    如果col建立了二級索引,則會周遊二級索引,否則主鍵索引

是以,性能上排序為:count(*) > count(1) > count(id) > count(col)。

在不考慮是否對null計數得差別的前提下,性能優化的方向,除了使用count(*) 外,就是适當使用小的二級索引。

繼續閱讀