1. 程式人生 > >MySQL count(*)、count(1)、count(column)的區別和執行效率比較

MySQL count(*)、count(1)、count(column)的區別和執行效率比較

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.383count(普通列))
select count(old_id) from shop_order

關於MyISAM中count函式的小記

    另外,在 MyISAM 中,count() 函式總是非常快的,不過這也是有前提條件的,即只有沒有任何 where 條件的 count(*)才非常快,這是這個引擎的特性。