我有两个表中的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获得优化的分页列表?
POSTDATA:
我已经使用了Stack Overflow的搜索,我发现了一些类似的问题,但答案不正确或问题不完全一样。两个例子:
Combining UNION and LIMIT operations in MySQL query
我很惊讶在Stack Overflow中没有人能回答这个问题。也许不可能更有效地进行这种查询?什么可以解决这个问题?
答案 0 :(得分:3)
我认为您可以在第二个链接中使用类似于解决方案的内容来至少帮助提高性能,但我怀疑您是否能够在以后的页面上获得出色的性能。例如:
( 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
您基本上将每个子查询限制为可能位于给定页面上的可能行的子集。通过这种方式,您只需要在确定返回哪个10之前从每个表中检索并合并20行。否则,服务器可能会抓取每个表中的所有行,对它们进行排序和合并,然后开始尝试查找正确的行。
虽然我没有经常使用MySQL,所以我无法保证引擎的行为符合我的想法:)
无论如何,一旦你到达后面的页面,你仍然会合并越来越大的数据集。但是,我强烈认为用户界面永远不应该允许用户检索一组记录,这些记录可以让他们进入(例如)第5000页。这对于人类大脑来说找到有用的数据太多了一次性完成,需要进一步过滤。也许让他们看到前100页(或其他一些数字),但否则他们必须更好地约束结果。只是我的意见。