关键词搜索

源码搜索 ×
×

SQL UNION vs OR 性能

发布2020-04-12浏览1723次

详情内容

本文整理自:stackoverflow

翻译自Bill Karwin回答:

要么你读的那篇文章用了一个不好的例子,要么你误解了他们的观点。

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通常在一个给定的查询中每个表只使用一个索引,那么应该使用哪个索引呢?如果它使用company上的索引,它仍然必须执行表扫描,以找到伦敦所在的行。如果它使用city上的索引,则必须对company为bbc的行进行表扫描。

        UNION 解决方案适用于这种情况。

        select username from users where company = 'bbc' 
        union
        select username from users where city = 'London';
        
        • 3

        这样的话每个子查询都可以使用索引进行搜索,然后再将子查询的结果合并在一起。

        union ? union all ? 取决于需求及where过滤后的数据量 对于索引列来最好使用union
        all,因复杂的查询【包含运算等】将使or、in放弃索引而全表扫描,除非你能确定or、in会使用索引。
        对于只有非索引字段来说你就老老实实的用or或者in,因为 非索引字段本来要全表扫描而union all 只成倍增加表扫描的次数。

        个人微信公众号:
        这里写图片描述

        个人博客
        https://jiankunking.com

        作者:jiankunking 出处:http://blog.csdn.net/jiankunking

        相关技术文章

        点击QQ咨询
        开通会员
        返回顶部
        ×
        微信扫码支付
        微信扫码支付
        确定支付下载
        请使用微信描二维码支付
        ×

        提示信息

        ×

        选择支付方式

        • 微信支付
        • 支付宝付款
        确定支付下载