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