【mysql】count(*)、count(1)和count(column)區別
小結:
count(*)
對行的數目進行計算,包含NULL。
count(column)
對特定的列的值具有的行數進行計算,不包含NULL值。
count(1)
這個用法和count(*)
的結果是一樣的。
性能問題:
1、任何情況下 SELECT COUNT(*) FROM tablename
是最優選擇;
2、盡量減少 SELECT COUNT(*) FROM tablename WHERE COL = 'value'
這種查詢;
3、杜絕 SELECT COUNT(COL) FROM tablename WHERE COL2 = 'value'
的出現。
如果表沒有主鍵,那么count(1)
比count(*)
快。
如果有主鍵,那么count(主鍵,聯合主鍵)
比count(*)
快。
如果表只有一個字段,count(*)
最快。
count(1)
跟count(主鍵)
一樣,只掃描主鍵。
count(*)
跟count(非主鍵)
一樣,掃描整個表。
count(*)、count(1)、count(column)執行效率高低比較
count(column) 會忽略為 null 的列,其他兩個不會。
執行效率:
它們三個的效率如何呢?網上說的各有各的理,當表中存在索引和主鍵的時候(我還沒接觸過設計表時不設計主鍵的),三者效率差不多。而我在《高性能MySQL》一書中看到這樣一段話:
當我們使用 count(*) 時,通配符 * 並不會像我們猜想的那樣擴展成所有的列,實際上,它會忽略所有的列而直接統計所有的行數。我們發現最常見的錯誤就是,在括號內指定一個列卻希望統計結果集的行數。如果希望知道的是結果集的行數,最好使用 count(*),這樣寫意義清晰,性能也會很好。
測試:
我用100萬數據進行測試,發現當且僅當三者有主鍵時,他們的執行時間幾乎相等
。
# 有主鍵:0.139s,無主鍵:0.283s
select count(*) from shop_order
# 有主鍵:0.154s,無主鍵:0.474s
select count(id) from shop_order
# 有主鍵:0.139s,無主鍵:0.285s
select count(1) from shop_order
# 有主鍵但不使用主鍵:0.383s (count(普通列))
select count(old_id) from shop_order
用75570717條數據進行測試,分別執行兩次,測試結果如下:
# 第一次:50.660s 第二次:45.891s
select count(*) from tb_mattress_sleep_raw_data
# 第一次:59.925s 第二次:46.948s
select count(`mattress_id`) from tb_mattress_sleep_raw_data
# 第一次:90.997s 第二次:70.314s
select count(`time_zone`) from tb_mattress_sleep_raw_data
另外,在 MyISAM 中,count() 函數總是非常快的,不過這也是有前提條件的,即只有沒有任何 where 條件的 count(*)才非常快,這是這個引擎的特性。
參考鏈接:
https://blog.csdn.net/qq_37674858/article/details/82683596
https://blog.csdn.net/qq_30038111/article/details/82386512