MySQL-为什么这个运行缓慢的查询未使用(似乎是)正确的索引?

时间:2019-05-30 13:58:05

标签: mysql query-optimization

此查询有效,并且可以执行我想要的操作,但运行速度非常慢。我们有一个交易表,其中包含金额,用户ID,合作伙伴ID和说明。当用户有3笔特定交易时,他们将获得一次性奖金。

SELECT t.str_spid, count(*) AS C
  FROM transactions t
  LEFT JOIN transactions AS x
    ON t.str_spid = x.str_spid
   AND x.str_prid = 148
   AND x.str_amount = 2500
 WHERE t.str_prid = 148
   AND (t.str_desc = "Annual Rewards" OR t.str_desc = "Annual Rewards (PRO)")
   AND t.str_amount = 2000
   AND x.str_spid IS NULL
 GROUP BY t.STR_SPID 
HAVING C = 3
 LIMIT 0,100;

我在各个字段上都有一个索引,然后按如下所示组合索引:

SPID_DE_PRID: STR_SPID, STR_DESC, STR_PRID
SPID_DE_PRID_AMT: STR_SPID, STR_AMOUNT, STR_DESC, STR_PRID

当我使用说明时,我会得到可能的按键(在t上):

STR_SPID,STR_PRID,STRAMT,STRDESC,SPID_PRID,SPID_DE_PRID,SPID_DE_PRID_AMT

使用的密钥:STR_PRID

在x上,我有可能:

STR_SPID,SPT_SOID,STRAMT,SPID_PRID,SPID_DE_PRID,SPID_DE_PRID_AMT

使用的密钥:STR_SPID

是否有更好的索引或方法可以重写它,使其运行得更快?

1 个答案:

答案 0 :(得分:1)

您在tstr_prid中搜索str_desc来查找特定值,因此它们应该是索引的前两列,但是您没有这样的索引。

优化器利用str_prid上的单列索引来做到最好,以缩小搜索范围。

如果您在(str_prid, str_amount, str_desc, str_spid)上有一个索引,那将是我对t的最佳优化。

然后针对x,您要查找匹配的行,因此要在(str_spid, str_prid, str_amount)上建立索引。