【问题标题】:MYSQL: Query 2 tables with union is very slow, how to improve?MYSQL:用union查询2个表很慢,如何改进?
【发布时间】: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 行?

【问题讨论】:

    标签: mysql select union


    【解决方案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:每个派生表都必须有自己的别名。有什么建议吗?
    • 我添加了缺少的别名
    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多