您好,登錄后才能下訂單哦!
這篇文章主要介紹MySQL中count(字段) 、count(主鍵 id) 、count(1)和count(*)的區別有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
首先要弄清楚 count() 的語義。count() 是一個聚合函數,對于返回的結果集,一行行地判斷,如果 count 函數的參數不是 NULL,累計值就加 1,否則不加。最后返回累計值。
所以,count(*)、count(1)和count(主鍵 id) 都表示返回滿足條件的結果集的總行數;而 count(字段),則表示返回滿足條件的數據行里面,參數“字段”不為 NULL 的總個數。
至于分析性能差別的時候,記住這么幾個原則:
server 層要什么就給什么;
InnoDB 只給必要的值;
現在的優化器只優化了 count(*) 的語義為“取行數”,其他“顯而易見”的優化并沒有做。
count(可空字段)
掃描全表,讀到server層,判斷字段可空,拿出該字段所有值,判斷每一個值是否為空,不為空則累加
count(非空字段)與count(主鍵 id)
掃描全表,讀到server層,判斷字段不可空,按行累加。
count(1)
掃描全表,但不取值,server層收到的每一行都是1,判斷不可能是null,按值累加。
注意:count(1)執行速度比count(主鍵 id)快的原因:從引擎返回 id 會涉及到解析數據行,以及拷貝字段值的操作。
count(*)
MySQL 執行count(*)在優化器做了專門優化。因為count(*)返回的行一定不是空。掃描全表,但是不取值,按行累加。
看到這里,你會說優化器就不能自己判斷一下嗎,主鍵 id 肯定是非空的,為什么不能按照 count(*) 來處理,多么簡單的優化。當然 MySQL 專門針對這個語句進行優化也不是不可以。但是這種需要專門優化的情況太多了,而且 MySQL 已經優化過 count(*) 了,你直接使用這種語句就可以了。
性能對比結論
count(可空字段) < count(非空字段) = count(主鍵 id) < count(1) ≈ count(*)
以上是“MySQL中count(字段) 、count(主鍵 id) 、count(1)和count(*)的區別有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。