mysql聯(lián)表查詢簡單優(yōu)化

今天在工作當(dāng)中遇到一個需要聯(lián)多張表查詢的業(yè)務(wù)場景,心里大概知道如果正常寫,放在線上去絕對是一個慢查詢,于是乎就想了一些優(yōu)化的點(diǎn),下面整理出來,我主要是講講思路,因?yàn)槊總€業(yè)務(wù)場景會不同,如果看到文章的大佬們有更好的方法,希望大佬們評論指出來哈,小弟在此跪謝了!
我們先來看一張圖片
image.png

通過explain工具得出,id是相同的,查詢表的順序就是從上至下,o->ol->ors->toi->oor,然后我們再看type字段,其中o和toi都是全表掃描,o表在生產(chǎn)環(huán)境中數(shù)據(jù)量是巨大的,絕對不允許出現(xiàn)全表掃描操作,所以我們就需要根據(jù)這個來優(yōu)化,讓兩個全表掃描降級;

ps:type字段按照性能排序system > const > eq_ref > ref > range > index > all,all是性能最低的,對于sql語句,至少要達(dá)到range級別;

通過業(yè)務(wù)場景可以將其中兩個left jion改為inner jion,而且查詢?nèi)掌谠谏a(chǎn)環(huán)境是有限定的,我們可以將語句修改如下;


image.png

這個時候可以看出就只會掃toi全表,通過業(yè)務(wù)邏輯分析,o 與 toi 是 inner join 關(guān)系,我們可以通過分析具體的業(yè)務(wù)邏輯來給一個滿足條件的時間范圍;


image.png

這個時候就可以達(dá)到一個稍微的優(yōu)化了;

呃,簡單說一下思路,因?yàn)槊總€人遇到的業(yè)務(wù)場景可能會不一樣...
1.寫語句的時候,先在測試環(huán)境利用explain工具看一下大致的情況
2.個人覺得的幾個關(guān)鍵點(diǎn)就是,type的all一定要杜絕,當(dāng)然,數(shù)據(jù)量很小的時候,可能是以這張表為驅(qū)動來執(zhí)行查詢的,視業(yè)務(wù)情況而定
3.id字段如果相同,執(zhí)行查詢的順序就是從上至下
最后,多表聯(lián)接的時候,字段最好明確出來,千萬不要 select * ,這里為了簡潔,所以用了 select * ,希望大佬們看到文章多多指點(diǎn),對于另外的一些字段,由于本人有些也理解也很模糊,等到了解清楚之后再來更新,請多多諒解!再次跪謝!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容