mysql - 如何加快sql查询?
问题描述
我有一个 SQL 查询如下:
SELECT p.Id1,p.Id2,p.Id3
FROM dataset1 p
WHERE p.Id2 IN (
SELECT r.Id4
FROM dataset1 r
WHERE r.Id5=125 AND r.Id6>=100000000000000 AND r.Id6<1000000000000000
)
ORDER BY p.Id1 DESC, p.Id2 DESC
然而,在这个范围内似乎有大量 Id6 的数据,因此计算需要相当长的时间。但我只有一小时来计算查询。因此,我想知道是否有人可以帮助我提高此查询的性能。
谢谢。
解决方案
由于过滤似乎是在 上完成的r
,所以先安排一下:
SELECT p.Id1, p.Id2, p.Id3
FROM ( SELECT id4
FROM dataset1 AS r
WHERE r.id5 = 125
AND r.Id6 >= 100000000000000
AND r.Id6 < 100000000000000 ) AS x
JOIN dataset1 AS p ON p.id2 = x.id4
ORDER BY p.Id1 DESC, p.Id2 DESC;
为此,这些索引应该是有益的:
INDEX(id5, id6, id4) -- covering
INDEX(id2, id1, id3) -- covering
您对 进行了“范围”测试id6
,但范围为空。我认为这是一个错误。请不要过分简化查询;我们可能会给您不适用的建议。我假设范围确实是一个范围。
推荐阅读
- java - 如何从 Firebase Android Query 中的 StartAt 特定位置和 EndAt 特定位置获取值
- c# - 如何让等到所有线程完成它从c#中的线程池工作
- ios - console.log 日志未显示在 Xcode 调试记录器中,也未显示在 Safari 调试记录器中
- c++ - 找不到文本文件?
- javascript - jQuery ajax async false 修改页面中的 html
- excel - 复制一个值并粘贴相同的值,直到它到达特定的单元格
- c# - 如何使用 MSBuild 构建项目?
- sql - 多行问题
- ansible - Ansible 错误:对 smtp.office365.com:587 的身份验证失败,请检查您的用户名和/或密码
- php - PHP中的断线未显示