SQL中的INNER JOIN和LEFT JOIN性能

时间:2017-02-28 23:13:22

标签: mysql sql-server

我在SQL中有这个查询,我想知道哪一个 (LEFT JOIN / INNER JOIN)我必须使用以提高速度和提高熟练程度

UPDATE poker_hands f
INNER JOIN (poker_cards a, poker_cards b, 
poker_cards c, poker_cards d,  poker_cards e)
ON f.r1 = a.card_name 
AND f.r2 = b.card_name
AND f.r3 = c.card_name
AND f.r4 = d.card_name
AND f.r5 = e.card_name
SET f.hand_type = 'Royal flush'
WHERE ((a.suit = b.suit AND b.suit = c.suit 
AND c.suit = d.suit AND d.suit = e.suit)
AND (a.game_value = 14 AND b.game_value = 13 
AND c.game_value = 12 AND d.game_value = 11 AND e.game_value = 10));

2 个答案:

答案 0 :(得分:1)

效果不是问题 - INNER JOINLEFT JOIN做不同的事情。使用符合您需求的任何一种

答案 1 :(得分:0)

使用此语句,WHERE子句中的谓词将否定LEFT JOIN的“外部性”,相当于INNER JOIN。

我希望优化器会认识到这一点,并在任何一种情况下选择最具成本效益的计划。我期望等效的执行计划,当INNER关键字替换为LEFT时,我不希望在此查询中发现性能差异。

但是没有看实际的执行计划,那只是猜想。要查看执行计划,我们可以使用EXPLAIN(对于MySQL)或SET SHOWPLAN_ALL ON(对于SQL Server或STATISTICS PROFILE ON等)。

可以观察和衡量不同陈述的实际表现。

我不明白你为什么要使用LEFT JOIN。

(并且将连接操作的旧式逗号语法与较新的JOIN关键字混合......具体是什么?)

就提高性能而言,我们确实需要确保合适的索引可用且正在使用。我们需要查看执行计划。我们可能需要确保收集和更新统计信息,我们可能需要对SQL进行一些调整以获得更有效的计划。

INNER替换为LEFT可能会对现有查询的性能产生影响,但它不太可能解决性能问题。

就个人而言,我更倾向于调查等效查询的性能,以此为出发点:

UPDATE poker_hands f
  JOIN poker_cards a ON a.card_name = f.r1 AND a.game_value = 14
  JOIN poker_cards b ON b.card_name = f.r2 AND b.game_value = 13 AND b.suit = a.suit
  JOIN poker_cards c ON c.card_name = f.r3 AND c.game_value = 12 AND c.suit = a.suit
  JOIN poker_cards d ON d.card_name = f.r4 AND d.game_value = 11 AND d.suit = a.suit
  JOIN poker_cards e ON e.card_name = f.r5 AND e.game_value = 10 AND e.suit = a.suit
   SET f.hand_type = 'Royal flush'