内联接VS联合全部,当找不到结果时

时间:2015-04-30 19:05:14

标签: sql join union-all

我有两个具有相同列名的表。我想在其中搜索。我已经研究并意识到使用function showMoreLogs() { var revealed = 0; $('.order-table').each(function() { var $this = $(this); if ($this.is(':hidden') && revealed < 10) { $(this).show(); revealed++; } }); var hidden = $('.order-table').filter(":hidden").size(); if (hidden > 0) { if (hidden == 1) { $('#more-orders').html('Get 1 More Change Logs'); } else if (hidden <=5) { $('#more-orders').html('Get ' + hidden + ' More Change Logs.'); } else { $('#more-orderd').html('Get 10 More Change Logs'); } } else { console.log("Hidden: ", hidden); $('#more-orders').hide(); } return false; } UNION ALL(在速度和性能方面)更好。现在我想知道是否找不到结果,INNER JOIN还好吗?

我认为JOIN关键字的算法是:如果在第一个表中找不到结果,则操作停止(在第二个表中,搜索不会)。但UNION ALL在任何情况下搜索所有表格。我认为是对的?如果我的想法是对的,那么当找不到结果时UNION ALL会更好吗?

指出:col被索引(phpmyadmin)。

如果找不到结果,哪一个有更好的性能?

INNER JOIN

VS

SELECT col FROM table1 WHERE col='test'
UNION ALL
SELECT col FROM table2 WHERE col='test';

1 个答案:

答案 0 :(得分:2)

UNION ALL通常更快。它不需要任何复杂的查找。它只是结合了两个查询结果。在INNER JOIN的情况下,是否从两个表中查询数据在很大程度上取决于数据库,更不用说具体细节(使用的索引等)。

那就是说,你的查询根本就不一样了。如果两个表都包含这样的记录,则UNION ALL的版本将返回两行,如果任一表包含匹配,则仍将返回一行。

如果两个表都包含匹配的记录,则INNER JOIN的版本 将返回一行,如果只有其中一个(或没有)包含匹配的记录,则不会返回一行

注意,INNER JOIN的{​​{1}}使用了未列别的列col,这可能会导致错误。

总的来说,不要根据理论开始优化。写出清晰易读的查询,尽可能地应用于这种情况(语义正确)。只在需要时进行优化。

另外,请注意不要优化错误的东西。即使INNER JOIN版本在没有找到数据的情况下会稍微快一点,UNION ALL版本仍然会闪电般快,所以最好选择更适合您的版本。确实有一场比赛。