今天幫同事看了一個(gè)滿查詢問(wèn)題少态,事情經(jīng)過(guò)是這樣的
之前很早的一個(gè)項(xiàng)目烦却,查詢邏輯寫到了存儲(chǔ)過(guò)程里面仔引,大概有5個(gè)表家厌,主表a,join b,c,d,子查詢e播玖,大概如下:
以下內(nèi)容都在存儲(chǔ)過(guò)程里面
select a.* ,b.id,c.id
from a
join b on a.id = b.aid
join c on b.id = c.bid
join d on c.id = d.did
join (select sum(stock),e.aid ?from ?group by e.aid)e??on a.id = e.aid?
一開始幾次的查詢,都挺快饭于,但是差不多到了第四次蜀踏,就慢了维蒙,然后覺(jué)得很奇怪,一開始覺(jué)得是數(shù)據(jù)的問(wèn)題果覆,把第一次存儲(chǔ)(快)跟慢的存儲(chǔ)(慢)颅痊,最終的sql語(yǔ)句,拷貝出來(lái)局待,發(fā)現(xiàn)就差在一個(gè)id范圍的問(wèn)題斑响,重新運(yùn)行了兩遍sql語(yǔ)句,發(fā)現(xiàn)sql又都很慢钳榨,然后就納悶了舰罚,為啥存儲(chǔ)里面很快,拷貝出來(lái)同樣的語(yǔ)句薛耻,卻很慢营罢。
考慮了一下,還是覺(jué)得應(yīng)該看一下語(yǔ)句本身的問(wèn)題饼齿,用最基礎(chǔ)的語(yǔ)句饲漾,explain 。候醒。能颁。杂瘸。倒淫。,發(fā)現(xiàn)其中a,d都沒(méi)有用索引败玉,都是全表掃描的敌土,a標(biāo)識(shí)3w+數(shù)據(jù),d是7w+的數(shù)據(jù)运翼,這就有意思了返干,會(huì)不會(huì)是子查詢不用索引呢?血淌?矩欠?心里打了問(wèn)號(hào)
然后換成了left join e表,又explain 了一下悠夯,發(fā)現(xiàn)e表就用索引了癌淮,速度就快了。沦补。乳蓄。