mysql - 由于 `Order by` 和 `Limit`,我的 SQL 运行速度非常慢

标签 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

最佳答案

去掉外部的SELECT;将 ORDER BYLIMIT 移入。

索引:

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/

相关文章:

python - 为什么 Python 的子进程的管道输出如此不可靠?

performance - 快速转储 Azure 表

Android Studio 如何操作 CountDownTimer

mysql - 如何在 SQL 中显示 NULL 记录

mysql - 即使记录不存在也返回行 一个表中的 2 个过滤器

mysql - 如何更改 mySQL NOW() 以便它适合另一个时区?

Mysql进程CPU使用率超过400%

php - 如何从按时间戳过滤的数据库中选择结果?

c# - 向 Youtube 发送缓慢的 HttpClient 请求

performance - 在没有优化的情况下添加冗余分配可以加快代码的速度