Mysql查询速度很慢而且没有使用正确的索引(通过使用group by,IN运算符)

时间:2016-01-29 08:17:02

标签: mysql performance query-tuning

以下查询执行时间超过5秒(表包含1m +记录)。 外部查询没有使用正确的索引它总是通过使用FULL表scan获取数据。有人帮我如何优化它..

查询

SELECT x 
  FROM UserCardXref x 
 WHERE x.userCardXrefId IN(
    SELECT MAX(y.userCardXrefId) 
      FROM UserCardXref y 
     WHERE y.usrId IN(1001,1002) 
     GROUP 
        BY y.usrId 
    HAVING COUNT(*) > 0
    )

查询说明

enter image description here

查询统计信息

enter image description here

执行计划

enter image description here

1 个答案:

答案 0 :(得分:0)

我会将查询重写为

select x.* from UserCardXref x
join (
 select max(userCardXrefId),usrId from UserCardXref 
 where usrId in (1001,1002) group by usrId
)y on x.userCardXrefId = y.userCardXrefId

您需要的索引

alter table UserCardXref add index userCardXrefId_idx(userCardXrefId)

usrId已根据解释计划编入索引,因此无需添加

你还有having count(*)>0你已经在使用max()函数了,对于给定的组它永远不会有0行所以我已经删除了它。