1. 程式人生 > >SQL語句中count(1),count(*)和count(field)區別

SQL語句中count(1),count(*)和count(field)區別

最近使用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)都有不同的方式,還有就是和版本都有關係,不同的版本會對查詢進行優化處理等等。

  1. count(*)對行的數目進行計算,包含NULL
  2. count(column)對特定的列的值具有的行數進行計算,不包含NULL值。
  3. count()還有一種使用方式,count(1)這個用法和count(*)的結果是一樣的。
  4. 任何情況下select count(*) from tablename是最優選擇;
  5. 儘量減少select count(*) from tablename where COL = ‘value’這種查詢;
  6. 杜絕select count(COL) from tablename where COL2 = ‘value’的出現。
  7. 如果表沒有主鍵,那麼count(1)比count(*)快。
  8. 如果有主鍵,那麼count(主鍵,聯合主鍵)比count(*)快。
  9. 如果表只有一個欄位,count(*)最快。
  10. count(1)跟count(主鍵)一樣,只掃描主鍵。count(*)跟count(非主鍵)一樣,掃描整個表。明顯前者更快一些。
  11. 若含有where語句,則會優先where中條件索引。