Mysql 查询优化

    SELECT

b.street AS street,

ifnull( sum( a.DEAL_AMOUNT ), 0 ) AS payAmountd,

count( DISTINCT a.ID_CARD ) AS peoplecount

FROM

a

JOIN b ON a.OLD_PERSON_ID = b.id

WHERE

b.city LIKE '京%'

AND b.shequ LIKE '山%'

GROUP BY

b.street

这个查询里 a 表有300w 数据,b表有200w 数据,a表的索引为OLD_PERSON_ID btree类型
b表的索引cityshequ,但是执行查询需要差不多10分钟的时间,求问各位大佬还能怎么优化?
执行解释计划,a表没走索引,b表走了id的索引


回答:

我只能给出一个优化的思路,如下:

一、看下面的语句是否能走索引,如果不能那就没办法优化了:

select id from b where b.city LIKE '京%' AND b.shequ LIKE '山%'

二、上面第一步是查 b 表,在这个基础上反过来查 a 表:

select * from a where a.old_person_id in 

(select id from b where b.city LIKE '京%' AND b.shequ LIKE '山%')

三、如果第二步也能得到优化,那么就可以再回过头来关联 b 表:

select

aa.id_card, aa.deal_amount, b.street

from (

select * from a where a.old_person_id in

(select id from b where b.city LIKE '京%' AND b.shequ LIKE '山%')

) aa

inner join b on aa.old_person_id=b.id

-- 注意上面的 join 方式根据实际业务需要而定

如果第三步能够得到优化,那么查出来的就是未汇总的明细数据,你只要将查询字段改为汇总表达式,再补上 group by 就可以了。

以上是 Mysql 查询优化 的全部内容, 来源链接: utcz.com/p/944197.html

回到顶部