MySQL count(*)、count(1)、count(column)的區別和執行效率比較
阿新 • • 發佈:2018-11-08
count(*)、count(1)、count(column)區別
count(column)
會忽略為 null
的列,其他兩個不會。
執行效率
它們三個的效率如何呢?網上說的各有各的理,當表中存在索引和主鍵的時候(我還沒接觸過設計表時不設計主鍵的),三者效率差不多。而我在《高效能MySQL》一書中看到這樣一段話:當我們使用 count(*)
時,萬用字元 * 並不會像我們猜想的那樣擴充套件成所有的列,實際上,它會忽略所有的列而直接統計所有的行數。我們發現最常見的錯誤就是,在括號內指定一個列卻希望統計結果集的行數。如果希望知道的是結果集的行數,最好使用 count(*)
,這樣寫意義清晰,效能也會很好。
測試
我用100萬資料進行測試,發現當且僅當三者有主鍵時,他們的執行時間幾乎相等。
# 有主鍵:0.139s,無主鍵:0.283
select count(*) from shop_order
# 有主鍵:0.154s,無主鍵:無主鍵:0.474
select count(id) from shop_order
# 有主鍵:0.139,無主鍵:0.285
select count(1) from shop_order
# 有主鍵但不使用主鍵:0.383 (count(普通列))
select count(old_id) from shop_order
關於MyISAM中count函式的小記
另外,在 MyISAM
中,count()
函式總是非常快的,不過這也是有前提條件的,即只有沒有任何 where
條件的 count(*)
才非常快,這是這個引擎的特性。