需求描述:壓力測試有兩張表,主從表,每個表100萬以上。現在要兩個表關聯並進行group by分組。
未優化sql:
select b.supplier_name,b.supplier_code,b.currency_id
from t_outsourcing_dtl a
left join t_outsourcing b on b.code=a.code and b.del_flag=a.del_flag
where a.state=「f」 and a.del_flag= 『0』
group by b.supplier_name,b.supplier_code,b.currency_id
這個查詢耗時170多秒。怎麼辦呢?這麼長時間領導肯定罵娘!你一定要相信千萬級以下都能夠用索引解決,為什麼看我寫的mysql原理。
首先我們用explain 看一下執行計畫,我們可以看到a 表並沒有走索引全表掃!(由於涉及公司業務表就不再說業務場景了,直接說我採坑的經歷吧。)
這裡還有個小技巧初學者可以玩一下。我們可以在上面的sql下加上
explain select b.supplier_name,b.supplier_code,b.currency_id
from t_outsourcing_dtl a
left join t_outsourcing b on b.code=a.code and b.del_flag=a.del_flag
where a.state=「f」 and a.del_flag= 『0』
group by b.supplier_name,b.supplier_code,b.currency_id;
show warnings
sql底層會將你的sql重新優化:但咱們可以看到我們的sql,沒有語法上優化的問題,如果有它就會給出優化後的sql,這裡你們自己玩一下。
selectmes_test
.b
.supplier_name
assupplier_name
,mes_test
.b
.supplier_code
assupplier_code
,mes_test
.b
.currency_id
ascurrency_id
frommes_test
.t_outsourcing_dtl
a
left joinmes_test
.t_outsourcing
b
on(((mes_test
.b
.del_flag
=mes_test
.a
.del_flag
) and (mes_test
.b
.code
=mes_test
.a
.code
))) where ((mes_test
.a
.state
= 『f』) and (mes_test
.a
.del_flag
= 『0』))
group bymes_test
.b
.supplier_name
,mes_test
.b
.supplier_code
,mes_test
.b
.`currency_id
繼續說問題的解決思路:
在不改變sql的情況下,我在這兩個表上試了幾個聚合索引但效果都不好!因為我這個從表有50萬符合主表關聯關係的資料。那麼mysql索引加的再好也是作用在50萬的臨時表,進行groupby。所以我換了一種思路。
那就是分表優化然後再合併在一起!直接上**!
執行計畫:
資料是用阿里的工具自動插入所以看上去沒意義。
總結:工作思路就是先加索引,能夠優化到秒出就可以了,不能就將資料超出多的佔執行計畫多的那張表,建索引進行資料篩選,然後再關聯在一起。
MYSQL索引例項
mysql描述 乙個文章庫,裡面有兩個表 category和article。category裡面有10條分類資料。article 裡面有20萬條。article裡面有乙個 article category 欄位是與category裡的 category id 字段相對應的。article表裡面已經把...
MySQL聯合索引例項
聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...
MySQL聯合索引例項
聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...