我在 MYSQL 上执行以下查询时遇到性能问题。下面的查询涉及 5 个表。当我应用 order by
和 limit
时,将在 0.3 秒内检索结果。但如果没有 order by
和 limit
,我就能在 0.01 秒内得到结果。我厌倦了更改查询,但这不起作用。有人可以帮助我完成此查询,以便我可以在所需的时间(<0.3 秒)内获得结果。
Below are the details.
m_todos = 286579 (records)
m_pat = 214858 (records)
users = 119 (records)
m_programs = 26 (records)
role = 4 (records)
SELECT *
FROM (
SELECT t.*,
mp.name as A_name,
u.first_name, u.last_name,
p.first, p.last, p.zone, p.language,p.handling,
r.name,
u2.first_name AS created_first_name,
u2.last_name AS created_last_name
FROM m_todos t
INNER JOIN role r ON t.role_id=r.id
INNER JOIN m_pat p ON t.patient_id = p.id
LEFT JOIN users u2 ON t.created_id=u2.id
LEFT JOIN m_programs mp ON t.prog_id=mp.id
LEFT JOIN users u ON t.user_id=u.id
WHERE t.role_id !='9'
AND t.completed = '0000-00-00 00:00:00'
) C
ORDER BY priority DESC, due ASC
LIMIT 0,10
最佳答案
去掉外部的SELECT
;将 ORDER BY
和 LIMIT
移入。
索引:
t: (completed)
t: (priority, due)
我假设优先级
和到期
在t
?请在查询中明确说明。它可能会产生巨大的变化。
如果以下方法有效,它应该会大大加快速度:首先查找 t.id
而不所有 JOIN
:
SELECT id
FROM m_todos
WHERE role_id !='9'
AND completed = '0000-00-00 00:00:00'
ORDER BY priority DESC, due DESC
LIMIT 10
这将受益于这个覆盖综合指数:
INDEX(completed, role_id, priority, due, id)
调试一下。然后在其余部分使用它:
SELECT t.*, the-other-stuff
FROM ( that-query ) AS t1
JOIN m_todos AS t USING(id)
then-the-rest-of-the-JOINs
ORDER BY priority DESC, due ASC -- yes, again
如果您不需要所有t.*
,则拼写出实际需要的列可能会有所帮助。
其运行速度更快的原因是仅通过查看一个表就可以有效地找到 10 行。原始代码处理的行数远多于 10 行,它们包含 t
的所有列,以及其他表中的列。
我的版本只对所有额外的内容进行 10 次查找。
关于mysql - 由于 `Order by` 和 `Limit`,我的 SQL 运行速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47788374/