count函數暗藏很多玄機,學習之前先嘗試回答以下幾個問題吧:
> 1、COUNT有幾種用法? > 2、COUNT(字段名)和COUNT(*)的查詢結果有什么不同? > 3、COUNT(1)和COUNT(*)之間有什么不同? > 4、COUNT(1)和COUNT(*)之間的效率哪個更高? > 5、為什么《阿里巴巴Java開發手冊》建議使用COUNT(*) > 6、MySQL的MyISAM引擎對COUNT(*)做了哪些優化? > 7、MySQL的InnoDB引擎對COUNT(*)做了哪些優化? > 8、上面提到的MySQL對COUNT(*)做的優化,有一個關鍵的前提是什么? > 9、SELECT COUNT(*) 的時候,加不加where條件有差別嗎? > 10、COUNT(*)、COUNT(1)和COUNT(字段名)的執行過程是怎樣的?
一、COUNT(字段)、COUNT(常量)和COUNT(*)之間的區別?
> count(常量)和count(*)表示的是直接查詢符合條件的數據庫表的行數。 > count(列名)表示的是查詢符合條件的列的值不為NULL的行數。
二、關於COUNT(*)和COUNT(1)
MySQL官方文檔這么說:
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
> 所以,對於count(1)和count(*),MySQL的優化是完全一樣的,根本不存在誰更快! > 但依舊建議使用count(*),因為這是SQL92定義的標准統計行數的語法。
三、關於COUNT(字段)
> 進行全表掃描,判斷指定字段的值是否為NULL,不為NULL則累加。 > 性能比count(1)和count(*)慢。
總結:
> COUNT函數的用法,主要用於統計表行數。主要用法有COUNT(*)、COUNT(字段)和COUNT(1)。 > 在InnoDB中COUNT(*)和COUNT(1)實現上沒有區別,而且效率一樣,但是COUNT(字段)需要進行字段的非NULL判斷,所以效率會低一些。 > 因為COUNT(*)是SQL92定義的標准統計行數的語法,並且效率高,所以請直接使用COUNT(*)查詢表的行數!