做一個積極的人
編碼、改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》中有如下:
-
當mysql確認括號內的表達式值不可能為空時,實際上就是在統計行數
-
如果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/
願你我在人生的路上能都變成最好的自己,能夠成為一個獨擋一面的人
© 每天都在變得更好的阿飛雲