SQL語句中count(1),count(*)和count(field)區別
阿新 • • 發佈:2018-12-26
最近使用count函式比較多,當要統計的數量比較大時,發現count(*)花費的時間比較多,相對來說count(1)花費的時間比較少。
查了一些文件有以下的說法:
- 如果你的資料表沒有主鍵,那麼count(1)比count(*)快
- 如果有主鍵的話,那主鍵(聯合主鍵)作為count的條件也比count(*)要快
- 如果你的表只有一個欄位的話那count(*)就是最快的啦
- count(*) count(1) 兩者比較。主要還是要count(1)所相對應的資料欄位。
- 如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。因為count(*),自動會優化指定到那一個欄位。所以沒必要去count(?),用count(*),sql會幫你完成優化的
count詳解:
count(*)將返回表格中所有存在的行的總數包括值為null的行,然而count(列名)將返回表格中除去null以外的所有行的總數(有預設值的列也會被計入). distinct 列名,得到的結果將是除去值為null和重複資料後的結果
在MySQL中,查詢研究得出這個和MySQL中用什麼引擎有關,比如InnoDB和MyISAM在處理這count(*)、count(1)、count(field)都有不同的方式,還有就是和版本都有關係,不同的版本會對查詢進行優化處理等等。
- count(*)對行的數目進行計算,包含NULL
- count(column)對特定的列的值具有的行數進行計算,不包含NULL值。
- count()還有一種使用方式,count(1)這個用法和count(*)的結果是一樣的。
- 任何情況下select count(*) from tablename是最優選擇;
- 儘量減少select count(*) from tablename where COL = ‘value’這種查詢;
- 杜絕select count(COL) from tablename where COL2 = ‘value’的出現。
- 如果表沒有主鍵,那麼count(1)比count(*)快。
- 如果有主鍵,那麼count(主鍵,聯合主鍵)比count(*)快。
- 如果表只有一個欄位,count(*)最快。
- count(1)跟count(主鍵)一樣,只掃描主鍵。count(*)跟count(非主鍵)一樣,掃描整個表。明顯前者更快一些。
- 若含有where語句,則會優先where中條件索引。