【问题标题】:Mysql query very slow and not using proper index (By using group by, IN operator )Mysql 查询非常慢并且没有使用正确的索引(通过使用 group by,IN 运算符)
【发布时间】:2016-01-29 16:32:12
【问题描述】:

以下查询需要 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
    )

查询说明

查询统计

执行计划

【问题讨论】:

  • 你需要一个userCardXrefId的索引

标签: mysql performance query-tuning


【解决方案1】:

我会将查询重写为

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 行,所以我已经删除了它。

【讨论】:

  • 感谢@Abhik Chakraborty
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多