這篇文章主要介紹MySQL中count(字段) 、count(主鍵 id) 、count(1)和count(*)的區(qū)別有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
目前成都創(chuàng)新互聯(lián)公司已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、陽谷網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
首先要弄清楚 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)化。當然 MySQL 專門針對這個語句進行優(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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章題目:MySQL中count(字段)、count(主鍵id)、count(1)和count(*)的區(qū)別有哪些
網(wǎng)頁鏈接:http://jinyejixie.com/article32/jjjgpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、微信公眾號、網(wǎng)站設(shè)計、、電子商務(wù)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)