我在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
答案 0 :(得分:0)
摆脱外部SELECT
;移动ORDER BY
和LIMIT
。
索引:
t: (completed)
t: (priority, due)
我认为priority
和due
在t
?请在查询中明确说明。它可能会产生巨大的差异。
如果以下情况有效,它应该会加快速度:首先找不到t.id
而不是所有JOINs
:
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次查找。