MYSQL:用union查询2个表很慢,如何改进?

Posted

技术标签:

【中文标题】MYSQL:用union查询2个表很慢,如何改进?【英文标题】:MYSQL: Query 2 tables with union is very slow, how to improve? 【发布时间】:2018-03-29 09:04:22 【问题描述】:

我想同时查询 2 个具有(几乎)相同行的表。结果,我想获取最近的 5 个条目(按日期排序,总共),无论它们来自哪个表

到目前为止,我试过这个:

SELECT date, name, text FROM `table_A` 
UNION 
SELECT date, name, text FROM `table_B` ORDER BY date desc LIMIT 5

不幸的是,这个查询大约需要 20 秒(两个表都有大约 300.000 行)。

当我这样做的时候:

SELECT date, name, text FROM `table_A` ORDER BY date desc LIMIT 5

SELECT date, name, text FROM `table_B` ORDER BY date desc LIMIT 5

查询只需要几毫秒。

所以我的问题是:我怎样才能提高我的查询速度,或者我应该使用什么选择查询从两个表中获取最新的 5 行?

【问题讨论】:

【参考方案1】:

在合并之前选择每个表中最近的 5 行。

SELECT *
FROM (
    (SELECT date, name, text FROM table_A ORDER BY date DESC LIMIT 5) 
    UNION
    (SELECT date, name, text FROM table_B ORDER BY date DESC LIMIT 5)
) x
ORDER BY date DESC
LIMIT 5

您的查询的问题在于,它首先合并整个表并删除重复项,然后再进行排序和限制。合并后的表没有索引,所以这部分很慢。

【讨论】:

嘿,谢谢,但这给了我错误 #1248:每个派生表都必须有自己的别名。有什么建议吗? 我添加了缺少的别名

以上是关于MYSQL:用union查询2个表很慢,如何改进?的主要内容,如果未能解决你的问题,请参考以下文章

查询INFORMATION_SCHEMA表很慢的性能优化

如何优化这个 MySql 查询 - 连接 3 个表?

mysql 千万级数据库如何进行多张结构相同的表联合查询?如何优化或设置提高查询速度?

SQL查询很慢。没有索引如何改进?

MySQL - 当一个表可能没有对应的行时,如何在查询中组合 2 个表

跨 2 个表的 Mysql SQL 查询 - 不知道如何正确执行