您阅读的文章使用了一个不好的例子,或者您误解了他们的观点。
select username from users where company = 'bbc' or company = 'itv';
这相当于:
select username from users where company IN ('bbc', 'itv');
MySQL 可以对此查询使用索引company
。没有必要做任何 UNION。
更棘手的情况是您的OR
条件涉及两个不同的列。
select username from users where company = 'bbc' or city = 'London';
假设有一个索引 oncompany
和一个单独的索引 on city
。鉴于 MySQL 通常在给定查询中每个表只使用一个索引,它应该使用哪个索引?如果它使用 上的索引company
,它仍然需要进行表扫描以查找city
伦敦所在的行。如果它使用 上的索引city
,则必须对company
bbc 所在的行进行表扫描。
UNION
解决方案是针对这种情况的。
select username from users where company = 'bbc'
union
select username from users where city = 'London';
现在每个子查询都可以使用索引进行搜索,子查询的结果由UNION
.
一位匿名用户提议对我上面的答案进行编辑,但版主拒绝了该编辑。它应该是评论,而不是编辑。提议的编辑声称 UNION 必须对结果集进行排序以消除重复行。这使查询运行速度变慢,因此索引优化是一种清洗。
我的回答是索引有助于在 UNION 发生之前将结果集减少到少数行。UNION 实际上确实消除了重复,但要做到这一点,它只需要对小的结果集进行排序。可能存在 WHERE 子句匹配表的重要部分的情况,并且在 UNION 期间进行排序与简单地进行表扫描一样昂贵。但更常见的是通过索引搜索减少结果集,因此排序比表扫描成本低得多。
差异取决于表中的数据以及正在搜索的术语。确定给定查询的最佳解决方案的唯一方法是在MySQL 查询分析器中尝试这两种方法并比较它们的性能。