您好,登錄后才能下訂單哦!
MySQL中COUNT查詢函數(shù)如何使用,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
首先創(chuàng)建一個(gè)表,只有id,name,sex三個(gè)字段,使用存儲(chǔ)過程隨機(jī)插入100萬條數(shù)據(jù):
select count(expr) from table;
可以看到count函數(shù)實(shí)際上需要傳入expr,這個(gè)expr一般取值有以下三個(gè):
列名:會(huì)檢索對應(yīng)列值不為NULL的條數(shù)。
*:查詢符合條件的行數(shù),和列值是否為NULL無關(guān),返回結(jié)果都會(huì)返回。
常量:查詢符合條件的行數(shù),和列值是否為NULL無關(guān),返回結(jié)果都會(huì)返回。
可以發(fā)現(xiàn)執(zhí)行速度兩條SQL語句是相差無幾的,count(1)和count(*)都是查詢?nèi)頂?shù)據(jù)行數(shù),可能網(wǎng)上很多言論會(huì)說count(*)其實(shí)走的就是count(1)查詢,所以使用count(1)查詢可以節(jié)省轉(zhuǎn)換時(shí)間,實(shí)際上無論count(*)還是count(1)完全一致,都是表示指定非空表達(dá)式,所以會(huì)查詢所有符合條件的行數(shù)。為什么我會(huì)說這兩個(gè)語句執(zhí)行效果是一樣的?因?yàn)镸ysql官方文檔寫了這么一句話:
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
可能有人會(huì)納悶我們添加索引列目的不就是為了提高查詢效率?平時(shí)我們檢索數(shù)據(jù)屬于范圍查詢,查詢指定的數(shù)據(jù),所以走索引可以提高查詢效率,但是count(id)選擇索引基數(shù)大的主鍵索引肯定效率更低。因?yàn)橹麈I索引和數(shù)據(jù)文件存放在一起,所以通過主鍵id取條數(shù)會(huì)檢索數(shù)據(jù)文件,count(id)會(huì)檢索整張表,然后遍歷取到每一行數(shù)據(jù)的id,然后返回server層對每一行的id,不為空count就 + 1,而count(*)一樣全表檢索,但是不會(huì)取id值,因?yàn)樵谒饕龢渚涂梢缘玫浇Y(jié)果,所以count(id)需要取到數(shù)據(jù)再過濾id為null的數(shù)據(jù)效率方面肯定是慢上不少的。
count(*)優(yōu)化
count(*)和count(1)沒什么差別,但是執(zhí)行時(shí)間都得1S多,而且數(shù)據(jù)量只是100萬條,所以我們肯定需要進(jìn)行適當(dāng)?shù)膬?yōu)化。因?yàn)閏ount(*)實(shí)際上查詢會(huì)使用最小字段的索引進(jìn)行優(yōu)化查詢,但是因?yàn)槟壳拔覀儽碇兄挥幸粋€(gè)主鍵索引,剛才也說過count(id)效率比count(*)低,所以默認(rèn)不使用索引查詢,我們可以使用explain測試下:
可以看到查詢沒有走任何索引,所以效率很低是必然的。而count(*)剛才說過會(huì)默認(rèn)尋找最小字段的索引優(yōu)化查詢,所以我們給表增加一個(gè)status字段,弄成tinyint類型,并且添加二級索引,然后測試count(*)執(zhí)行時(shí)間:
count(col)
說完了count(*),我們知道了如果在需要返回全部行數(shù)時(shí)可以使用count(*),那接下來我們?nèi)绻枰樵冃彰粸榭盏目傂袛?shù)怎么做呢?我們可以加個(gè)where很快實(shí)現(xiàn):
很顯然,本次查詢走索引了,加速查詢的原因是什么呢?因?yàn)槲覀冊趎ame字段創(chuàng)建了一個(gè)二級索引,在無二級索引時(shí),count操作只能全表檢索數(shù)據(jù)。當(dāng)我們通過二級索引統(tǒng)計(jì)總條數(shù),無需掃描數(shù)據(jù)文件,因?yàn)槎壦饕鎯?chǔ)的數(shù)據(jù)就是name字段的值與主鍵id值。所以在count(col)時(shí)就可以在字段上添加一個(gè)二級索引加快檢索速率。
count函數(shù)指定where條件
這里一樣得分兩種情況:count(*)和count(col)。
select count(*) from order_info where type = 0;
看完上述內(nèi)容,你們掌握MySQL中COUNT查詢函數(shù)如何使用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。