1,比較count(*)和count(字段名)的區別:前者對行的數目進行計算,包含null。后者對特定的列的值具有的行數進行計算,不包含null,得到的結果將是除去值為null和重復數據后的結果。
2,count(1)跟count(主鍵)一樣,只掃描主鍵。
3,count(*)和count(1)在使用方式上一樣,但是在性能上有略微的區別。
首先,mysql數據庫本身對count(*)做了特別的優化處理,如果開發中確實需要使用到count聚合,那么優先考慮count(*)。
其次,count(主鍵)不一定比count(其余索引)快。索引是一種b+樹的結構,以塊為單位進行存儲。假設索引大小為4B,有一個字段A的索引大小為2B。同樣一個塊,能存放256個主鍵索引,但是能存放512個字段A的索引。假設總數據量是2K條,意味著索引占用了8個塊,而字段A索引占用了4個塊,統計時用主鍵需要經歷的io次數多,效率也比A字段索引慢。
接著,在使用count聚合函數時,如有where條件,且where條件的字段未建立索引,則查詢不會走索引,直接掃描了全表。
最后,count(字段),該字段非主鍵的情況最好不要出現,因為該方式不走索引。