今天在工作當(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)化了;