我必须有 2 个表,第一个是带有 3.000.000 条记录的 MEMORY 表,第二个现在是空的。这些表的结构是相同的,都有一个 int(11) 主键,两个表的主键字段都不同(两个表中不可能有相同的键)
如果我查询第一个表,我会在 0.1 秒内得到答案,那么第二个表的查询会立即 0.01 秒。但是将 2 与 UNION ALL 合并非常慢(1 分 21 秒)。
Run Code Online (Sandbox Code Playgroud)SELECT * FROM memtable1 LIMIT 1000
(0.1 秒)
Run Code Online (Sandbox Code Playgroud)SELECT * FROM table2 LIMIT 1000
(0.01 秒)
Run Code Online (Sandbox Code Playgroud)SELECT * FROM memtable1 UNION ALL SELECT * FROM table2 LIMIT 1000
(1分21秒)
如何提高查询速度?
您的查询相当于这个:
(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)
归档时间: |
|
查看次数: |
3982 次 |
最近记录: |