首页 > 解决方案 > MySQL - 为什么这个运行缓慢的查询没有使用(似乎是)正确的索引?

问题描述

此查询有效,并且执行我想要它执行的操作,但运行速度非常慢。我们有一个交易表,其中包含金额、用户 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

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

标签: mysqlquery-optimization

解决方案


您在and中搜索t特定值,因此它们应该是索引的前两列,但您没有这样的索引。str_pridstr_desc

优化器尽最大努力使用 上的单列索引str_prid来缩小搜索范围。

如果您对此有一个索引(str_prid, str_amount, str_desc, str_spid),那么我希望对t.

然后对于x,您需要查找匹配的行,因此您需要在(str_spid, str_prid, str_amount).


推荐阅读