關(guān)于Mysql索引查詢效率問題
問題描述
SELECT COUNT(*) FROM `set_gif` WHERE `zhuanid` = 0 AND `webid` IN (’0’,’2’,’21’,’22’,’27’,’11’,’31’) AND `empty` = 0 LIMIT 1 [ RunTime:0.1423s ]SELECT `id`,`webid`,`catid`,`path`,`pname`,`pathall`,`title`,`cdn`,`sort`,`likecount`,`fsize`,`time`,`viewcount`,`likecount` FROM `set_gif` WHERE `zhuanid` = 0 AND `webid` IN (’0’,’2’,’21’,’22’,’27’,’11’,’31’) AND `empty` = 0 ORDER BY time desc,id desc LIMIT 0,10 [ RunTime:0.0045s ]
兩個(gè)sql語句 后面runtime是執(zhí)行時(shí)間的意思 數(shù)據(jù)量是150W
字段說明 zhuanid是數(shù)值 webid是數(shù)值 empty是0或者1
第一句SQL使用的普通索引是 zhuanid webid empty的數(shù)的一組索引第二句SQL使用的索引是zhuanid webid empty一組索引 time 與 id是一組索引
為什么第一句的count會(huì)消耗這么長的時(shí)間 相比第二句復(fù)雜的查詢反而是很短的時(shí)間
問題解答
回答1:第一句sql, limit 1第二句sql, limit 0, 10你讓count去數(shù)150w條....還想比查看前10條快?
回答2:我的猜測(cè):索引字段沒有設(shè)置不可為空,導(dǎo)致 count(*) 沒有使用到索引。
另外這兩條語句本身并不等價(jià),第一條針對(duì)全表,第二條不是,好像沒啥可比性
回答3:要看一下你的執(zhí)行計(jì)劃 第一條sql結(jié)果集很大的情況下是需要掃描所有符合條件的記錄的 這種情況下第二條sql走time id的索引只需要找到10條滿足條件的記錄即可 所以會(huì)比較快 另外zhuanid webid empty的組合索引也只會(huì)使用到zhuanid列和webid的range部分 可以修改索引順序?yàn)閦huanid empty webid
回答4:第一條SQL執(zhí)行后,結(jié)果保存在Cache.
第二條SQL執(zhí)行,依賴了第一條SQL的Cache,所以會(huì)更快(其實(shí)第二條SQL用了排序,應(yīng)該更慢才對(duì)).
樓主可以在第一條SQL執(zhí)行完后,執(zhí)行
RESET QUERY CACHE;
重置Cache,然后在執(zhí)行第二條SQL,結(jié)果是不一樣的.
相關(guān)文章:
1. index.php錯(cuò)誤,求指點(diǎn)2. javascript - 如何判斷用戶切換到了當(dāng)前標(biāo)簽頁?3. 微信chooseImage接口部分機(jī)型選擇圖片后莫名其妙的跳轉(zhuǎn)其他頁面4. node.js - node垃圾回收、內(nèi)存泄漏相關(guān)問題5. android - 新建項(xiàng)目卡在Gradle:Resolvedependencies’:app:_debugCompile’6. css - 為什么設(shè)置了charset="UTF-8"中文還是亂碼呢?并且文件編碼也是UTF-8,用的sublime7. python小白,問一個(gè)關(guān)于可變類型和不可變類型底層的問題8. python - Pycharm的Debug用不了9. python運(yùn)行后沒有任何反饋要怎么排查10. html5 - qq空間播放視頻的返回?cái)?shù)據(jù)
