SELECT
COUNT(0)
FROM
t_orh_apply
WHERE (
deleted = FALSE
AND o_type IN ('5', '2', '6')
AND c_code = '5020'
AND (
(a_id IN ()) --引數 100條以內
OR (c_id IN ()) --引數最大大概1200 資料關聯另外一個表t_c
OR (e_id IN ()) --引數大概25000左右 資料關聯另外一個表t_e
OR (w_id IN ()) --引數100條以內
)
) ;
此sql查詢相對較慢 大概8s左右,主表資料(t_orh_apply) 534456 ,t_c :1200,t_e:25000
c_id IN () 和e_id IN () 陳述句中如果用子查詢后能走索引,但是查詢出此id集合的關聯sql相對復雜不能抽成一個 sql
求大佬指點有什么優化的方案
uj5u.com熱心網友回復:
OR 改成union all4個id建索引
c_id in和e_id in改成inner join,把t_c和t_e作為驅動表(放左邊)
uj5u.com熱心網友回復:
SELECT
COUNT(*)
FROM
t_orh_apply AS t
LEFT JOIN t_c AS c ON t.c_id = c.id
LEFT JOIN t_e AS e ON t.e_id = e.id
LEFT JOIN t_w AS w ON t.w_id = w.id
WHERE t.deleted = FALSE AND t.o_type IN ('5', '2', '6') AND t.c_code = '5020'
AND c.id IN () AND e.id IN() AND w.id IN ()
uj5u.com熱心網友回復:
a_id、c_id、e_id、w_id,分別加上索引。是加4個索引,不是1個索引4個欄位。SELECT (SELECT COUNT(0)
FROM t_orh_apply
WHERE deleted = FALSE
AND o_type IN ('5', '2', '6')
AND c_code = '5020'
AND a_id IN ()) + (SELECT COUNT(0)
FROM t_orh_apply
WHERE deleted = FALSE
AND o_type IN ('5', '2', '6')
AND c_code = '5020'
AND c_id IN ()) +
(SELECT COUNT(0)
FROM t_orh_apply
WHERE deleted = FALSE
AND o_type IN ('5', '2', '6')
AND c_code = '5020'
AND e_id IN ()) + (SELECT COUNT(0)
FROM t_orh_apply
WHERE deleted = FALSE
AND o_type IN ('5', '2', '6')
AND c_code = '5020'
AND w_id IN ())
FROM DUAL;
uj5u.com熱心網友回復:
改成這個反而慢了,而且可能沒去重復

走了兩個索引a_id、 w_id
uj5u.com熱心網友回復:
e_id 存在空值不能inner,原來4個id都有單獨的索引的
uj5u.com熱心網友回復:
in的內容建立臨時表,在要關聯的物理表的欄位建索引,然后做關聯查詢,擴大innodb_join_buffer_size值,擴大read_buffer_size,read_rnd_buffer_size, max_length_for_sort_data,innodb_buffer_pool_sizuj5u.com熱心網友回復:
tmp_table_size 擴大轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/16728.html
標籤:MySQL
上一篇:在觸發器函式里面實作插入修改字串,但只能插入或修改數值,不能插入字串。
下一篇:hive3常用命令總結
