mysql union all与muliple select在大型数据库上的性能比较

sh7euo9m  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(348)

我有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倍的差异。返回的行数与此有关吗?
如果是的话,多个查询返回的行数要比一个大查询返回的行数要少吗?

xjreopfe

xjreopfe1#

视情况而定。
首先,在mysql查询中,小于10ms非常小,几乎不值得讨论或比较。
以前就是这样 UNIONs 将创建一个临时表并从每个临时表中收集数据 SELECT . 然后它将temp表中的行传递给客户机。也就是说 UNION 可能会慢一点。
你有什么版本?mysql的最新版本有一个优化,可以帮助您的测试用例(但不是所有的测试用例) UNION --它将省去temp表,并从一个表中传递行 SELECT 一次直接给客户。
对于发送到服务器的每个单独的sql,都有不小的开销。这个 UNION 为1sql;三个独立的 SELECTs 是3。也就是说 UNION 可能更快,尤其是对于较新的版本。
此外,由于上面提到的开销,1000行(小)可能无法代表1000000行(中)或10亿行(大)的情况(我不知道你认为什么是“大”,但1000绝对不是“大”。)
还要记住,1.3ms的很大一部分是将数据发送回客户端所需的时间。

相关问题