多表關聯如何建立索引

我是用的三張表進行關聯的,一大兩小。下面看一下三張表的具體結構。

 

三張圖對應三張表,然後下面是我寫的查詢sql

select
a.*,
b.*,
c.*
from 
statjiankong_etl a
left join
ibnr b on a.anadate = b.anadate and a.STARTYEAR = b.startyy and a.comcode2 = b.comcode2 and a.centercode = b.centercode and a.BUSINESSTYPECODE = b.BUSINESSTYPECODE and (case when a.kindclass = 'BZ' then '01' else '02' end) = b.riskcode
left join
jinxiangshui c
on a.comcode2 = c.comcode2 and (case when a.kindclass = 'BZ' then '01' else '02' end) = c.riskcode
where a.anadate = '201908';

根據這個sql,沒加索引的話執行計劃是這樣的。

因爲a表按照anadate分區,所以只掃描了條件的分區,剩下的都是全表掃描,意料之中。但是執行時間實在是太長了,我提交之後,運行了差不多一個小時,還沒有結果,我給停了...

然後我就開始分析,該怎麼加索引才能查詢更快。

因爲和a表的關聯條件有多個,所以我首先想到的是組合索引。我知道組合索引有最左原則,但是我有一個條件是我的分區字段,所以我就把它跳過了,我覺得多數對索引不瞭解的同學都會是這個思路。

跳過那個字段之後,我把a表的關聯條件建了個組合索引,然後執行計劃是這樣的。毫無變化。

後來我又給小表加了索引。

 

果然,小表加完索引,關聯的兩個表立刻就走索引了。接着我把a表的分區字段也加到了組合索引裏,我又重新建立了a表的索引。

 

這樣三張表關聯就完全走索引了,查詢時間 縮小到了100s

上面是一個比較典型的多表關聯,如何加索引的案例,持續關注,我會把我遇到的所以優化的案例一一列舉,有想法的夥伴也可以直接線上交流,非常感謝你。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章