03.08 mysql中的count(*)、count(1)、count(字段)有什麼區別嗎?


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(字段),該字段非主鍵的情況最好不要出現,因為該方式不走索引。


分享到:


相關文章: