溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL中count(字段) 、count(主鍵 id) 、count(1)和count(*)的區(qū)別有哪些

發(fā)布時間:2021-12-03 15:18:53 來源:億速云 閱讀:311 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要介紹MySQL中count(字段) 、count(主鍵 id) 、count(1)和count(*)的區(qū)別有哪些,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

首先要弄清楚 count() 的語義。count() 是一個聚合函數(shù),對于返回的結(jié)果集,一行行地判斷,如果 count 函數(shù)的參數(shù)不是 NULL,累計值就加 1,否則不加。最后返回累計值。

所以,count(*)、count(1)和count(主鍵 id) 都表示返回滿足條件的結(jié)果集的總行數(shù);而 count(字段),則表示返回滿足條件的數(shù)據(jù)行里面,參數(shù)“字段”不為 NULL 的總個數(shù)。

至于分析性能差別的時候,記住這么幾個原則:

  • server 層要什么就給什么;

  • InnoDB 只給必要的值;

  • 現(xiàn)在的優(yōu)化器只優(yōu)化了 count(*) 的語義為“取行數(shù)”,其他“顯而易見”的優(yōu)化并沒有做。

count(可空字段)

掃描全表,讀到server層,判斷字段可空,拿出該字段所有值,判斷每一個值是否為空,不為空則累加

count(非空字段)與count(主鍵 id)

掃描全表,讀到server層,判斷字段不可空,按行累加。

count(1)

掃描全表,但不取值,server層收到的每一行都是1,判斷不可能是null,按值累加。

注意:count(1)執(zhí)行速度比count(主鍵 id)快的原因:從引擎返回 id 會涉及到解析數(shù)據(jù)行,以及拷貝字段值的操作。

count(*)

MySQL 執(zhí)行count(*)在優(yōu)化器做了專門優(yōu)化。因為count(*)返回的行一定不是空。掃描全表,但是不取值,按行累加。

看到這里,你會說優(yōu)化器就不能自己判斷一下嗎,主鍵 id 肯定是非空的,為什么不能按照 count(*) 來處理,多么簡單的優(yōu)化。當(dāng)然 MySQL 專門針對這個語句進(jìn)行優(yōu)化也不是不可以。但是這種需要專門優(yōu)化的情況太多了,而且 MySQL 已經(jīng)優(yōu)化過 count(*) 了,你直接使用這種語句就可以了。

性能對比結(jié)論

count(可空字段) < count(非空字段) = count(主鍵 id) < count(1) ≈ count(*)

以上是“MySQL中count(字段) 、count(主鍵 id) 、count(1)和count(*)的區(qū)別有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI