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

作一個積極的人html

編碼、改bug、提高本身mysql

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

x 能夠表明: 主鍵id、字段、一、*數據庫

0 說明

對於count(主鍵id)來講編程

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

對於count(字段)來講優化

若是這個字段定義爲not null,一行行的從記錄裏面讀出這個字段,判斷不爲空,則累加值編碼

若是這個字段定義容許爲null,那麼執行的時候,判斷到有可能爲null,還要把值取出來在判斷一下,不是null才累加翻譯

對於count(1)來講code

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 的官方手冊中: dev.mysql.com/doc/refman/…

有這麼一段:

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

在這裏插入圖片描述


謝謝你的閱讀,若是您以爲這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到!祝你天天開心愉快!



無論作什麼,只要堅持下去就會看到不同!在路上,不卑不亢!

願你我在人生的路上能都變成最好的本身,可以成爲一個獨擋一面的人

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

相關文章
相關標籤/搜索