mysql索引例項

2021-10-03 08:52:34 字數 2859 閱讀 5781

需求描述:壓力測試有兩張表,主從表,每個表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_nameassupplier_name,mes_test.b.supplier_codeassupplier_code,mes_test.b.currency_idascurrency_idfrommes_test.t_outsourcing_dtla

left joinmes_test.t_outsourcingb

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進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...