0
点赞
收藏
分享

微信扫一扫

查询使用or还是union

路西法阁下 2022-02-15 阅读 86
SELECT DISTINCT
    *
FROM
    test
WHERE
    cid = 123456
AND (
    (eid = 7890123)
    OR sid IN (
        SELECT
            sid
        FROM
            test
        WHERE
            cid = 123456
        GROUP BY
            sid
        HAVING
            COUNT(*) = 1
    )
)

优化之使用union代替or

SELECT DISTINCT
	* 
FROM
	test 
WHERE
	cid = 900458 
	AND eid = 1021355 UNION
SELECT
	sid 
FROM
	test 
WHERE
	cid = 900458 
GROUP BY
	sid 
HAVING
	COUNT( * ) = 1

Union比OR更快?

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

  2. MySQL 通常是使用一个索引来扫描表的,如果有两个索引的时候,第二个索引就要再扫一边
    如果时用UNION就是两次都扫一个索引。
    (我觉得第一个时间复杂度时O(logn*logn), 第二个是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
举报

相关推荐

0 条评论