【问题标题】:MySQL UNION ALL vs muliple SELECT performance on large databsesMySQL UNION ALL 与大型数据库上的多个 SELECT 性能
【发布时间】: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


【解决方案1】:

视情况而定。

首先,10ms 以下在 MySQL 查询中太小了,几乎不值得争论或比较。

过去所有UNIONs 都会创建一个临时表并将每个SELECT 的数据收集到其中。然后它将临时表中的行传递给客户端。这表示UNION 可能会更慢。

你有什么版本?最新版本的 MySQL 有一项优化,可以帮助您的 测试用例(但不是UNION 的所有用例——它将省去临时表,并从一个SELECT 以时间直接给客户。

发送到服务器的每个单独的 SQL 都会产生不小的开销。 UNION 是 1 个 SQL; 3 个单独的 SELECTs 是 3。这表示 UNION 可能更快,尤其是对于较新的版本。

此外,由于上面提到的开销,1000 行(小)可能不代表 1000000 行(中)或 10 亿行(大)会发生什么。 (我不知道你认为什么是“大”,但 1000 绝对不是“大”。)

另外请记住,1.3 毫秒的很大一部分是将数据发送回客户端所需的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多