count(*)、count(1)和count(column)區別以及執行效率高低比較


【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(idfrom shop_order

# 有主鍵:0.139s,無主鍵:0.285s
select count(1from 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM