哪个版本的查询更快/最佳做法?(好奇的事情。)
更重要的是,它们是否相同?
这些查询是否在此示例中完成相同的操作?
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);
答案 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更有效地执行密钥,看看我是否可以通过某种方式模拟某些表的某些表格。