MySQL 的COUNT(x)性能怎么樣?


做一個積極的人

編碼、改bug、提升自己

我有一個樂園,面向編程,春暖花開!

x 可以代表: 主鍵id、字段、1、*

0 說明

對於count(主鍵id)來說

innodb引擎會遍歷整張表,把每一行的id值都取出來,返回給server層,server層判斷id值不為空,就按行累加

對於count(字段)來說

如果這個字段定義為not null,一行行的從記錄里面讀出這個字段,判斷不為空,則累加值

如果這個字段定義允許為null,那么執行的時候,判斷到有可能為null,還要把值取出來在判斷一下,不是null才累加

對於count(1)來說

innodb引擎遍歷整張表,但不取值,返回給server層,server對於返回的每一行,放一個數字1進去,判斷是不可能為空的,就按行累加

對於count(*)

並不會把全部字段取出來,而是專門做了優化,不取值,count(*)肯定不是null,按行累加

1 總結

如果你要統計行數就用count(*)或者count(1),推薦前者

如果要統計某個字段不為NULL值的個數就用count(字段)

在《高性能MySQL》中有如下:

  1. 當mysql確認括號內的表達式值不可能為空時,實際上就是在統計行數

  2. 如果mysql知道某列col不可能為NULL值,那么mysql內部會將count(col)表達式優化為count(*)

也就是說count(主鍵字段)和count(1)還是要優化到count(*)的。

在 MySQL 5.7 Reference Manual 的官方手冊中: https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_count

有這么一段:

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

翻譯: InnoDB以相同的方式處理SELECT COUNT(*)和SELECT COUNT(1)操作。沒有性能差異。

所以這幾個按照效率排序的話,count(字段)<count(主鍵id)<count(1)≈count(*)

所以,盡量使用count(*)

2 拓展

在阿里巴巴的 Mysql數據庫 >> ( 三) ) SQL

在這里插入圖片描述


謝謝你的閱讀,如果您覺得這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到!祝你每天開心愉快!


 

不管做什么,只要堅持下去就會看到不一樣!在路上,不卑不亢!

博客首頁 : https://aflyun.blog.csdn.net/

願你我在人生的路上能都變成最好的自己,能夠成為一個獨擋一面的人

© 每天都在變得更好的阿飛雲


免責聲明!

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



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