mysql - 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
是否有更好的索引或方法来重写它以使其运行得更快?
解决方案
您在and中搜索t
特定值,因此它们应该是索引的前两列,但您没有这样的索引。str_prid
str_desc
优化器尽最大努力使用 上的单列索引str_prid
来缩小搜索范围。
如果您对此有一个索引(str_prid, str_amount, str_desc, str_spid)
,那么我希望对t
.
然后对于x
,您需要查找匹配的行,因此您需要在(str_spid, str_prid, str_amount)
.
推荐阅读
- javascript - 在 Angular 中通过 *ngIf 过滤循环给出错误
- css - CSS:媒体查询延迟
- javascript - 如何在ajax成功方法中将javaScript json对象转换为C#对象
- php - 样式多页链接 (index.php?first_page) - PHP
- amazon-web-services - 如何在 AWS AppSync 控制台中测试订阅?
- php - PHP中的矩阵(3位置)MLM树
- html - CSS 水平条和 div 边框未对齐的问题
- c# - 从 Visual Studio 工具窗口更改自定义编辑器中按钮的内容
- vue.js - Vue多重布局
- c++ - 从 C++ 中的链表中获取元素