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表的索引city
,shequ
,但是执行查询需要差不多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