您阅读的文章使用了一个错误的例子,或者您误解了他们的观点。
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';
假设在上有一个索引,在上company
有一个单独的索引city
。鉴于MySQL通常在给定查询中每个表只使用一个索引,应该使用哪个索引?如果它使用on上的索引company
,则仍必须进行表扫描以查找city
伦敦所在的行。如果使用on上的索引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查询探查器中尝试这两种方法并比较它们的性能。
UNION
这需要做更多的工作,因为它需要删除重复项,其中过滤器将提取指定的条件。不建议使用,我感到很惊讶IN
。