【发布时间】:2018-08-04 11:55:44
【问题描述】:
我有 3 个大型数据库,我需要对所有 3 个数据库运行相同的查询。查询如下所示:
SELECT table1.a, table1.b, table2.a, table2.c
FROM databse_A.table1
INNER JOIN databse_A.table2 ON table1.a = table2.a
我决定使用 UNION ALL 来组合来自多个数据库的结果,所以最后的查询看起来像这样:
SELECT table1.a, table1.b, table2.a, table2.c
FROM databse_A.table1
INNER JOIN databse_A.table2 ON table1.a = table2.a
UNION ALL
SELECT table1.a, table1.b, table2.a, table2.c
FROM databse_B.table1
INNER JOIN databse_B.table2 ON table1.a = table2.a
UNION ALL
SELECT table1.a, table1.b, table2.a, table2.c
FROM databse_C.table1
INNER JOIN databse_C.table2 ON table1.a = table2.a
上面的查询花费了 0.0068 执行并返回了大约 3000 行。然后我决定在没有UNION ALL 的情况下进行测试。我清除了数据库缓存并将每个 SELECT 作为单独的查询运行(每个查询返回大约 1000 行),最后 3 个查询需要 0.0023(总计)来执行。
当数据库缓存时,查询时间从 0.0068 变为 0.0055,从 0.0023 变为 0.0013。
所以我的问题是,为什么最终执行相同操作的查询之间存在几乎 3 倍的差异。返回的行数与此有关吗?
如果是,多个查询返回的行数比一个返回大量行的大查询更好吗?
【问题讨论】:
-
可能是集成集合有一些开销。再说一次,开销是最小的,你在这里谈论的是 4 毫秒。根据您的服务器设置和使用结果的方式,您可能会损失更多的往返时间和处理开销。
-
顺便说一句,您知道查询中允许有换行符和空格,对吧? ;)
-
为什么不用一个数据库而不是三个?
-
@GolezTrol 是的,我知道,这些是从 PHP 代码中复制的。
-
@Strawberry 因为这是我们决定使用的最佳数据结构。
标签: mysql performance performance-testing