由于`Order by`&amp ;;我的SQL运行速度很慢`Limit`

时间:2017-12-13 08:17:11

标签: mysql performance

我在MYSQL上的查询存在性能问题。以下查询涉及5个表。当我应用order bylimit时,结果将在0.3秒内检索到。但是如果没有order bylimit,我就可以在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

1 个答案:

答案 0 :(得分:0)

摆脱外部SELECT;移动ORDER BYLIMIT

索引:

t:  (completed)
t:  (priority, due)

我认为priorityduet?请在查询中明确说明。它可能会产生巨大的差异。

如果以下情况有效,它应该会加快速度:首先找不到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次查找。