首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从具有UNION ALL的查询中获得优化的分页列表?

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

Stack Overflow用户
提问于 2011-09-28 02:37:46
回答 1查看 1.1K关注 0票数 1

我有一个由来自两个表的UNION构成的查询。结果必须进行排序和分页(就像web应用程序的典型列表一样)。

原始查询(简化)为:

代码语言:javascript
复制
SELECT name, id
FROM _test1 -- conditions WHERE
UNION ALL
SELECT name, id
FROM _test2 -- conditions WHERE
ORDER BY name DESC LIMIT 10,20

问题是这两个表每个都有100多万行,并且查询非常慢。

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

Postdata:

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

Optimize a UNION mysql query

Combining UNION and LIMIT operations in MySQL query

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

EN

Stack Overflow用户

回答已采纳

发布于 2011-09-28 03:19:11

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

代码语言:javascript
复制
(   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页(或其他一些数字),但否则他们必须更好地约束结果。不过,这只是我的观点。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7574059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档