由于线上出现慢sql的警告,于是进行优化
每一个inner join on 后面的条件都建有索引
原句:
select p.eval_id
FROM
p_evaluation p
INNER JOIN crm_consumer_company ccc ON
ccc.company_id = p.company_id
INNER JOIN crm_dept cd ON
cd.related_company_id = ccc.server_company_id
INNER JOIN biaoju_caishui.zhubajie_caishui_crm.crm_staff cs ON
cs.company_id = cd.company_id
AND cs.staff_id = 9169
WHERE
1 = 1
AND p.data_type = 'EVAL'
AND p.staff_type = 'ACCT'
这个inner join 没有走索引。原因具体的我也不知道
后面就直接想到拆分
优化后:
SELECT
count(p.eval_id)
FROM
biaoju_caishui.zhubajie_caishui_crm.p_evaluation p
RIGHT join (
SELECT
company_id
FROM
biaoju_caishui.zhubajie_caishui_crm.crm_consumer_company a
RIGHT join (
SELECT
DISTINCT related_company_id
FROM
biaoju_caishui.zhubajie_caishui_crm.crm_dept
where
company_id = (SELECT company_id from biaoju_caishui.zhubajie_caishui_crm.crm_staff where staff_id=9169) ) bb on
bb.related_company_id = a.server_company_id
where
bb.related_company_id is not null) cc on
cc.company_id = p.company_id
where
p.data_type = 'EVAL'
AND p.staff_type = 'ACCT'
把每一个inner join 拆出来 然后用右连接来进行数据的查询,这样每个索引都没用到了。速度直接快了很多