MYSQL 使用 UNION ALL 减慢速度

Zen*_*eno 1 mysql

我必须有 2 个表,第一个是带有 3.000.000 条记录的 MEMORY 表,第二个现在是空的。这些表的结构是相同的,都有一个 int(11) 主键,两个表的主键字段都不同(两个表中不可能有相同的键)

如果我查询第一个表,我会在 0.1 秒内得到答案,那么第二个表的查询会立即 0.01 秒。但是将 2 与 UNION ALL 合并非常慢(1 分 21 秒)。

SELECT * FROM memtable1 LIMIT 1000 
Run Code Online (Sandbox Code Playgroud)

(0.1 秒)

SELECT * FROM table2 LIMIT 1000 
Run Code Online (Sandbox Code Playgroud)

(0.01 秒)

SELECT * FROM memtable1 
UNION ALL 
SELECT * FROM table2 LIMIT 1000 
Run Code Online (Sandbox Code Playgroud)

(1分21秒)

如何提高查询速度?

ype*_*eᵀᴹ 9

您的查询相当于这个:

(SELECT * FROM memtable1) 
UNION ALL 
(SELECT * FROM table2)
LIMIT 1000 ;
Run Code Online (Sandbox Code Playgroud)

查询要求从 的所有行memtable1,没有任何限制。然后UNION应用 并将LIMIT 1000应用于 的结果UNION。似乎执行计划不是很有效,首先获取内存中两个表的行(所以 10 万行),然后应用限制。

如果您只需要每个表中的 1000 行,请尝试以下操作:

(SELECT * FROM memtable1 LIMIT 1000) 
UNION ALL 
(SELECT * FROM table2 LIMIT 1000) ;
Run Code Online (Sandbox Code Playgroud)

如果您想要两个表中最多 1000 行:

(SELECT * FROM memtable1 LIMIT 1000) 
UNION ALL 
(SELECT * FROM table2 LIMIT 1000) 
LIMIT 1000 ;
Run Code Online (Sandbox Code Playgroud)