Mysql之:count(*)、count(常量)、count(字段)的區別


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(*)查詢表的行數!

 


免責聲明!

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



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