1

我有一个由两个表中的 UNION ALL 形成的查询。必须对结果进行排序和分页(如 Web 应用程序的典型列表)。

原始查询(简化)是:

SELECT name, id
FROM _test1 -- conditions WHERE
UNION ALL
SELECT name, id
FROM _test2 -- conditions WHERE
ORDER BY name DESC LIMIT 10,20

问题是2张表每张都超过100万行,查询很慢。

如何从 UNION ALL 获得优化的分页列表?

发布数据:

我使用了 Stack Overflow 的搜索,发现了一些类似的问题,但答案不正确或问题不完全相同。两个例子:

优化 UNION mysql 查询

在 MySQL 查询中结合 UNION 和 LIMIT 操作

我很惊讶在 Stack Overflow 中没有人能回答这个问题。也许不可能更有效地执行此查询?有什么办法可以解决这个问题?

4

1 回答 1

4

我认为您可以在第二个链接中使用与解决方案类似的东西来至少提高性能,但我怀疑您能否在以后的页面上获得出色的性能。例如:

(   SELECT name, id
    FROM _test1 -- conditions WHERE
    ORDER BY name DESC LIMIT 0, 30
)
UNION ALL
(   SELECT name, id
    FROM _test2 -- conditions WHERE
   ORDER BY name DESC LIMIT 0, 30
)
ORDER BY name DESC
LIMIT 10, 20

您基本上将每个子查询限制为可能在给定页面上的可能行的子集。这样,您只需要从每个表中检索并合并 20 行,然后再确定要返回哪 10 行。否则,服务器可能会从每个表中获取所有行,对它们进行排序和合并,然后开始尝试找到正确的行。

虽然我不经常使用 MySQL,所以我不能保证引擎会按照我认为的方式运行 :)

无论如何,一旦您进入后面的页面,您仍将合并越来越大的数据集。但是,我强烈认为 UI 永远不应该允许用户检索一组记录,让他们进入(例如)第 5000 页。对于人类大脑来说,这简直是太多的数据,无法一次发现所有有用的信息,并且应该需要进一步过滤。也许让他们看到前 100 页(或其他数字),否则他们必须更好地限制结果。不过只是我的看法。

于 2011-09-27T19:19:11.207 回答