在MySQL中,這幾個都是統計操作,很多人在使用的時候,都使用的是count(1),這有沒有問題?使用正確?達到了統計效果? 我們從效果和效率兩方面來分析下 執行效果 count(*) 包括了所有的列,在統計時不會忽略列值為null的數據count(1) 用1表示代碼行,在統計時不會忽略列值為nul ...
在MySQL中,這幾個都是統計操作,很多人在使用的時候,都使用的是count(1),這有沒有問題?使用正確?達到了統計效果?
我們從效果和效率兩方面來分析下
執行效果
count(*) 包括了所有的列,在統計時不會忽略列值為null的數據
count(1) 用1表示代碼行,在統計時不會忽略列值為null的數據
count(列名)在統計時,會忽略列值為空的數據,就是說某個欄位的值為null時不統計
簡單來說,count(*) 和count(1) 都統計null列,count(列名)不統計null列
執行效率
1、InnoDB引擎
count(欄位) < count(1) = count(*)
InnoDB通過遍歷最小的可用二級索引來處理select count(*) 語句,除非索引或優化器提示指示優化器使用不同的索引如果二級索引不存在,則通過掃描聚簇索引來處理
2、MyISAM引擎
count(欄位) < count(1) <= count(*)
- MyISAM存儲了數據的準確行數,使用
count(*)
會直接讀取該行數 - 當第一列定義為NOT NULL時,count(1)和count(*)一樣
- count(列名) 會遍歷整個表,但不同的是,它會先獲取列,然後判斷是否為空,然後累加,因此count(列名)性能不如前兩者
總結
- 優先使用count(*),這是SQL92 定義的標準統計行數的語法,跟資料庫無關,與NULL也無關
- 在InnoDB中,count(1) 等同於count(*),統計NULL的話,使用誰都OK
- count(列名) 是統計列值數量,不計NULL,相同列值算一個