作一個積極的人html
編碼、改bug、提高本身mysql
我有一個樂園,面向編程,春暖花開!sql
x 能夠表明: 主鍵id、字段、一、*數據庫
對於count(主鍵id)來講編程
innodb引擎會遍歷整張表,把每一行的id值都取出來,返回給server層,server層判斷id值不爲空,就按行累加性能
對於count(字段)來講優化
若是這個字段定義爲not null,一行行的從記錄裏面讀出這個字段,判斷不爲空,則累加值編碼
若是這個字段定義容許爲null,那麼執行的時候,判斷到有可能爲null,還要把值取出來在判斷一下,不是null才累加翻譯
對於count(1)來講code
innodb引擎遍歷整張表,但不取值,返回給server層,server對於返回的每一行,放一個數字1進去,判斷是不可能爲空的,就按行累加
對於count(*)
並不會把所有字段取出來,而是專門作了優化,不取值,count(*)確定不是null,按行累加
若是你要統計行數就用count(*)
或者count(1)
,推薦前者
若是要統計某個字段不爲NULL值的個數就用count(字段)
在《**高性能MySQL》**中有以下:
當mysql確認括號內的表達式值不可能爲空時,實際上就是在統計行數
若是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(*)
在阿里巴巴的 Mysql數據庫 >> ( 三) ) SQL
謝謝你的閱讀,若是您以爲這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到!祝你天天開心愉快!
無論作什麼,只要堅持下去就會看到不同!在路上,不卑不亢!
願你我在人生的路上能都變成最好的本身,可以成爲一個獨擋一面的人
© 天天都在變得更好的阿飛雲