我有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倍的差异。返回的行数与此有关吗?
如果是,那么有多个查询返回的行数比一个大查询返回的行数更好?
答案 0 :(得分:0)
要视情况而定。
首先,MySQL查询中的10ms以下时间太短,几乎不值得辩论或比较。
过去,所有UNIONs
都会创建一个临时表,并从每个SELECT
收集数据。然后,它将临时表中的行传递到客户端。也就是说UNION
可能会更慢。
您有什么版本?最新版本的MySQL进行了优化,可以帮助您您的测试用例(但并非所有UNION
的用例-它将免除temp表,并从一个{{1 }}直接发送给客户。
发送到服务器的每个单独的SQL都有不小的开销。 SELECT
是1个SQL; 3个单独的UNION
是3。这表示SELECTs
可能会更快,尤其是对于较新的版本。
此外,由于上述开销,1000行(小)可能无法代表1000000行(中)或10亿行(大)的情况。 (我不知道您认为“大”是多少,但绝对不是1000。)
还要记住,1.3ms的很大一部分是将数据发送回客户端所花费的时间。