繁体   English   中英

如何从具有UNION ALL的查询中获取优化的分页列表?

[英]How to get a optimized paginated list from a query that has a UNION ALL?

我有一个由两个表的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中没有人能回答这个问题。 也许不可能更有效地执行此查询? 有什么办法可以解决这个问题?

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

(   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页(或其他号码),否则他们必须更好地限制结果。 只是我的意见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM