【问题标题】:MySQL UNION ALL is too slowMySQL UNION ALL 太慢了
【发布时间】: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 上有索引
  • 让我知道表格的结构

标签: mysql performance union union-all


【解决方案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 中,它甚至避免了临时表。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多