從慢日誌報表中看到一條很長的sql
select
id from
myinfo
where 1 = 1
and ((
substring_index(location_axis, '$', 3) like concat('%$', 2334)
or substring_index(location_axis, '$', 3) like concat(concat('%$', 2334), '$%')
) or (
substring_index(location_axis, '$', 3) like concat('%$', 2337)
or substring_index(location_axis, '$', 3) like concat(concat('%$', 2337), '$%')
) or (
substring_index(location_axis, '$', 3) like concat('%$', 2340)
or substring_index(location_axis, '$', 3) like concat(concat('%$', 2340), '$%')
) or (
substring_index(location_axis, '$', 3) like concat('%$', 2353)
or substring_index(location_axis, '$', 3) like concat(concat('%$', 2353), '$%')
) or (
substring_index(location_axis, '$', 3) like concat('%$', 2367)
or substring_index(location_axis, '$', 3) like concat(concat('%$', 2367), '$%')
) or ......
詢問開發得知是通過程式拼成的sql
表中存入的location_axis是區域資訊,存三個區域,用$分隔,如 $1$2$3,可以看出要實現的是匹配值是否在location_axis中的第乙個域或第二個域中
匹配的值是從另乙個表中根據條件獲取的如:
select it_area_id itinfo where dep_id='0111'
問題:繁瑣、字首為%無法使用索引,導致比較慢
優化方式:
將第乙個地域編碼和第二個分別存在單獨的列中,然後和表it_area_id進行關聯查詢
變更表結構
alter table myinfo add first_axis varchar(10),add sec_axis varchar(10);
update myinfo t1 inner join (select id,substring_index(substring_index(location_axis,'$',2),'$',-1) as c1 from itinfo)t2 using(id) set t1.first_axis=t2.c1;
update myinfo t1 inner join (select id,substring_index(substring_index(location_axis,'$',3),'$',-1) as c1 from itinfo)t2 using(id) set t1.sec_axis=t2.c1;
查詢語句變為
select opr_bo_id from myinfo t1 inner join itinfo t2 on t1.first_axis=t2.it_area_id or t1.sec_axis=t2.it_area_id where t2.dep_id='0111';
結果達到毫秒級別
SQL 優化案例之變更表結構
從慢日誌報表中看到一條很長的sql select id from myinfo where1 1and substring index location axis,3 like concat 2334 or substring index location axis,3 like concat co...
SQL優化案例150811
最近遇到個sql 跑的很慢,第一次12秒出結果 從磁碟讀入記憶體 第二次2秒出結果 資料都在buffer cache裡面 sql 如下 html view plain copy print?select count 0 from p left join r on p.id r id p 有200w ...
優化案例 分割槽表場景下的SQL優化
有個表做了分割槽,每天乙個分割槽。該錶上有個查詢,經常只查詢表中某一天資料,但每次都幾乎要掃瞄整個分割槽的所有資料,有什麼辦法進行優化嗎?有乙個大表,每天產生的資料量約100萬,所以就採用表分割槽方案,每天乙個分割槽。下面是該錶的ddl create table t1 id bigint 20 no...