我可以找到这个问题的最接近的是这个问题,但这并不是我想要的,因为他们的示例似乎会大大减少他们的选择(切下一张桌子对于那些具有指定ID的人(,而我的示例将涉及数百万行。
假设表A和表B都有50列和100万行。
做得更好:
SELECT
a.person,
cats,
dogs,
birds,
gerbils
FROM a
LEFT JOIN b
ON a.person = b.person
或更好地做:
SELECT
a1.person,
cats,
dogs,
birds,
gerbils
FROM
(
SELECT
person,
cats,
dogs
FROM
a
) a1
LEFT JOIN
(
SELECT
person,
birds,
gerbils
FROM
b
) b1
ON a.person = b.person
我的本能告诉我第二次可能更糟,因为它似乎试图在内存中持有更多的数据,而不是第一个。我认为第一个查询仅在内存中完全连接到内存中,而第二个查询可能会持有数百万行数据,并将其归为指定的列。我认为这是对的吗?
编辑:感谢您的响应,每个人都花了一段时间对此进行了测试,因为我的实际查询非常广泛,我找不到一个小错误。第一个绝对更有效。它在30秒内完成了,而第一个在跑步几个小时后就无法完成,这使我认为我的资源超载。
"选择列表"唯一可以在索引中完全解析查询并且不需要表访问的唯一时间;因此,通常,仅选择需要使用的列,并在不需要的情况下远离叶子。