此查询有效,并且可以执行我想要的操作,但运行速度非常慢。我们有一个交易表,其中包含金额,用户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
是否有更好的索引或方法可以重写它,使其运行得更快?
答案 0 :(得分:1)
您在t
和str_prid
中搜索str_desc
来查找特定值,因此它们应该是索引的前两列,但是您没有这样的索引。
优化器利用str_prid
上的单列索引来做到最好,以缩小搜索范围。
如果您在(str_prid, str_amount, str_desc, str_spid)
上有一个索引,那将是我对t
的最佳优化。
然后针对x
,您要查找匹配的行,因此要在(str_spid, str_prid, str_amount)
上建立索引。