mysql - SQL QUERY - UNION - 多个相同的表需要很长时间

标签 mysql sql-server

我对数据库的查询有一个大问题。

我解释了我的问题,我有 11 个相同的表(备份)。这些表完全相同,我需要从中提取数据,但这需要很长时间。

我正在使用这样的联合查询:

select id, name, ... from table_1 WHERE (...)
UNION
select id, name, ... from table_3 WHERE (...)
UNION 
select id, name, ... from table_2 WHERE (...)
... ORDER BY created DESC LIMIT 0,50

但仅查询需要大约 16 秒!数据库没有那么多数据,花了这么长时间......

table_1 = 1.3k
table_2 = 17k
table_3 = 10k
table_4 = 10k 
...     = 10k
table_11= 140K

你能帮我优化这个查询吗?非常感谢!

最佳答案

首先,不要使用 UNION —— 除非你想承担删除重复项的开销。相反,使用 UNION ALL:

select id, name, ... from table_1 WHERE (...)
UNION ALL
select id, name, ... from table_3 WHERE (...)
UNION ALL
select id, name, ... from table_2 WHERE (...)
...
ORDER BY created DESC
LIMIT 0, 50;

您还可以通过使用适合 WHERE 子句的索引来提高性能。但是,您的问题没有足够的信息。

实际上,另一个优化是在联合之前从每个子查询中获取前 50 行:

(select id, name, ... from table_1 WHERE (...) ORDER BY created DESC LIMIT 50)
UNION ALL
(select id, name, ... from table_3 WHERE (...) ORDER BY created DESC LIMIT 50)
UNION ALL
(select id, name, ... from table_2 WHERE (...) ORDER BY created DESC LIMIT 50)
...
ORDER BY created DESC
LIMIT 0, 50;

这减少了最终 ORDER BY 的数据量,这也应该加快速度。

关于mysql - SQL QUERY - UNION - 多个相同的表需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39039003/

相关文章:

mysql - docker,无法启动从官方 docker 镜像 mysql 构建的 docker mysql 容器

php - 无法从存储引擎读取自动增量值

mysql - 为什么 MySQL 卡在这个简单的子查询上?

SQL Server sp_ExecuteSQL 和执行计划

c# - INNER JOIN 3 使用 LINQ 的数据表

sql-server - 根据单个不同列选择唯一行

sql-server - 查询所有表数据并进行索引压缩

mysql - 使用日期时间类型的字段计算当前日期的结果

mysql - 在 LINQ 和 Entity Framework 中使用笛卡尔积来组合 3 个表

sql-server - 绕过消息 : Informational: The full-text search condition contained noise word(s)