内联和联盟全部

时间:2012-02-20 19:15:39

标签: mysql sql union inner-join

哪个版本的查询更快/最佳做法?(好奇的事情。)

更重要的是,它们是否相同?

这些查询是否在此示例中完成相同的操作?

1)INNER JOIN有两个OR条件:

SELECT
  DISTINCT (cat.id) as 'Cat ID:'
FROM
  cat
INNER JOIN cuteness_showdown ON
  (cat.id = cuteness_showdown.cat_1 OR cat.id = cuteness_showdown.cat_2);

2)分别查询每列和UNION ALL:

SELECT
  DISTINCT (table_1.id) as 'Cat ID:'
FROM
  (SELECT
    cuteness_showdown.cat_1 AS id
  FROM
    cuteness_showdown
  UNION ALL
  SELECT
    cuteness_showdown.cat_2 AS id
    FROM
    cuteness_showdown) AS table_1;

现在,如果我需要其他表中的列,哪个版本更快/最佳?

1)INNER JOIN有两个OR条件(无变化):

SELECT
  DISTINCT (cat.id) as 'Cat ID:',
  cat.name as 'Cat Name:'
FROM
  cat
INNER JOIN cuteness_showdown ON
  (cat.id = cuteness_showdown.cat_1 OR cat.id = cuteness_showdown.cat_2);

2)分别查询每一列和UNION ALL(需要INNER JOIN猫表):

SELECT
  DISTINCT (table_1.id) as 'Cat ID:'
  cat.name as 'Cat Name:'
FROM
  (SELECT
    cuteness_showdown.cat_1 AS id
  FROM
    cuteness_showdown
  UNION ALL
  SELECT
    cuteness_showdown.cat_2 AS id
  FROM
    cuteness_showdown) AS table_1
INNER JOIN cat on
  (table_1.id = cat.id);

2 个答案:

答案 0 :(得分:4)

要找出哪个更快,打破一个终端,编写一个每1000次运行一次的脚本并比较结果:)

至于它们是否相同,查询优化器通常会为几个执行相同操作的SQL查询提出完全相同的执行计划,因此它们可能就是这样。我不能告诉你这些是否会得到这种处理,但你可以使用EXPLAIN来查看自己的执行计划并比较它们,假设你有一些数据。

如果执行计划确实相同,那么最佳做法是选择更易读的语句,以便其他任何维护代码的人都可以轻松完成。或者,如果它们不相同,那么您必须决定难以阅读的声明是否值得获得额外的性能增益,这取决于项目中的交易性能有多大。我认为,如果你有一个相对较小的数据库,这个数据库不太可能扩展很多,而且响应时间不到10毫秒,那么性能不是问题,所以只是让它易于维护。

答案 1 :(得分:2)

还有另一种选择,

SELECT
  DISTINCT (cat.id) as 'Cat ID:'
FROM
  cat
INNER JOIN cuteness_showdown ON
  cat.id IN (cuteness_showdown.cat_1,cuteness_showdown.cat_2)

非常小的区别,但有趣的是,IN()似乎总是比OR更有效地执行密钥,看看我是否可以通过某种方式模拟某些表的某些表格。