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 太慢了的主要内容,如果未能解决你的问题,请参考以下文章