Mysql中Union和OR性能对比

博客已搬家,更多内容查看https://liangyongrui.github.io/

Mysql中Union和OR性能对比

在leetcode上看到一篇文章,整理一下

参考:https://leetcode.com/problems/big-countries/discuss/103561/Union-and-OR-and-the-Explanation

有两种SQL,结果是一样的,但是第二种快一点:

#用OR
SELECT name, population, area
FROM World
WHERE area > 3000000 OR population > 25000000

#用Union
SELECT name, population, area
FROM World
WHERE area > 3000000 
UNION
SELECT name, population, area
FROM World
WHERE population > 25000000

为什么Union比OR更快呢?

  1. 严格的讲,用Union更快仅限于扫描两个不同的列
    (当然,UNION ALL 比 UNION 更快)

  2. MySQL 通常是使用一个索引来扫描表的,如果有两个索引的时候,第二个索引就要再扫一边
    如果时用UNION就是两次都扫一个索引。
    (我觉得第一个时间复杂度时O(lognlogn), 第二个是O(logn 2), 忽略常数时间复杂度不变

  3. benchmark 关于 UNION 和 OR, 有下表

    • Scenario 3: Selecting all columns for different fields

      CPUReadsDurationRow Counts
      OR4712784431228
      UNION3113344001228
    • Scenario 4: Selecting Clustered index columns for different fields

      CPUReadsDurationRow Counts
      OR03193661228
      UNION0501931228
  4. 总结:
    • 从benchmark的表上来看不加索引的话几乎没区别, 甚至用OR的读性能更好。
    • 我觉得在性能不是特别敏感的时候,还是用or比较好。因为代码简介,可读性高。反之用Union

转载于:https://www.cnblogs.com/liangyongrui/p/8612081.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值