0

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

询问

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
    )

查询说明

在此处输入图像描述

查询统计

在此处输入图像描述

执行计划

在此处输入图像描述

4

1 回答 1

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 行,因此我已将其删除。

于 2016-01-29T08:25:03.630 回答