MySQL UNION ALL 太慢了

Posted

技术标签:

【中文标题】MySQL UNION ALL 太慢了【英文标题】:MySQL UNION ALL is too slow 【发布时间】:2019-12-02 03:42:49 【问题描述】:

我在 mysql 中有一个来自 4 个表的查询。当我单独运行这些查询时,它们会在 1 秒内快速运行。

但是当我使用 UNION ALL 组合它们时,机器会承受重负载,并且在 UNION ALL 中执行相同查询至少需要 10 秒。而且我已经挖掘了整个互联网,包括 YouTube,但不幸的是我还没有找到任何解决方案。

请指教。 谢谢。

code

SELECT *
FROM (
    SELECT id, sessionId FROM promotion
    UNION ALL
    SELECT id, sessionId FROM transport_details
    UNION ALL
    SELECT id, sessionId FROM fee_details
) a;

【问题讨论】:

我只能看到3张桌子 例如,我在这里只放了 3 张桌子。实际上它有超过 3 个表。 但是同样的查询在 MS SQL Server 中运行得更快。 你可以在你的 ms sql 上有索引 让我知道表格的结构 【参考方案1】:

感谢所有参与我提问的开发者。

虽然我没有找到任何令人满意的MySQLUNION ALL慢查询的解决方法。但是通过优化 MySQL 单个查询,我已经将它管理到了 80%。

还有一项增加内存和 CPU 限制的规定。

【讨论】:

附带说明:包含导致性能提升的特定更改会很有用。否则不清楚。 @informatik01 感谢更新。我将尝试提及这些步骤。谢谢【参考方案2】:

通过创建一个临时表并为其添加索引,将解决您的问题

id int(11),
sessionId varchar(255),
key id(id)
);

insert into tbl1 (id,sessionId)
select id, sessionId from promotion;

create temporary table tbl2(
id int(11),
sessionId varchar(255),
key id(id)
);
insert into tbl2 (id,sessionId)
select id, sessionId from transport_details;


create temporary table tbl3(
id int(11),
sessionId varchar(255),
key id(id)
);
insert into tbl3 (id,sessionId)
select id, sessionId from fee_details;

select * from tbl1 union all 
select * from tbl2 union all
select * from tbl3

【讨论】:

亲爱的 Vaibhav,我需要简单的查询而不是日志代码。感谢您的尝试。 你检查了吗,这个查询需要多长时间? 联合所有会减慢查询速度。因为当 mysql 执行联合查询时,它会在内存中创建一个表,然后合并结果。此时您的索引已消失。这就是您的查询变慢的原因。 你是对的,单个查询更快,因为它只会在你使用联合时给你结果,它几乎不需要在内部执行额外的工作。 没有索引是有用的。手动创建多个临时表更糟糕,而不是让 MySQL 创建单个临时表并附加到它,UNION ALL 就是这样做的。 (在版本 8 中,它甚至避免了临时表。)

以上是关于MySQL UNION ALL 太慢了的主要内容,如果未能解决你的问题,请参考以下文章

优化我的mysql语句! - 兰德()太慢了

带有Left Join的Mysql查询太慢了

mysql模糊查询的优化方法--亲自实践

mysql中union和union all的区别和注意点

mysql union和union all的区别

mysql union all和union的区别