首先给出结论:SQL语句中使用UNION ALL取代OR不一定能够提升效率,具体情况要视情况而定
情况1. 连接字段较少,存在非索引字段,条件简单情况下
使用OR,进行一次全表扫描,不走cust_order_id的索引,执行时长:3273
使用UNION ALL,先走cust_order_id的索引,再进行全表扫描,反而用时更高.执行时长:3287
情况2: 连接字段较多,都是索引字段,条件简单情况下
使用OR,都走索引,耗时52
使用union all,都走索引,耗时43
结论:
union all 并不一定就比 or及in 快,要结合实际情况分析到底使用哪种情况。
对于索引列来最好使用union all,因复杂的查询【包含运算等】将使or、in放弃索引而全表扫描,除非你能确定or、in会使用索引
对于只有非索引字段来说你就老老实实的用or 或者in,因为 非索引字段本来要全表扫描而union all 只成倍增加表扫描的次数
对于既有索引字段【索引字段有效】又包含非索引字段来时,按理你也使用or 、in或者union all 都可以,推荐使用or、in。
以上主要针对的是单表,而多表联合查询来说,考虑的地方就比较多了,比如连接方式,查询表数据量分布、索引等,再结合单表的策略选择合适的关键字