2.2:在非索引列中使用 or、in及
union
all
。
我们查 VNAME 为 M98,M85220,M9888589的三个数据各个耗时如下:
我们发现为啥
union
all
查询时间几乎为 or 和in的三倍。
这是为什么呢,我们先不说,先看看三个的查询计划。
这里我们发现计划几乎一样。
但我们要注意扫描的此时对于 or及in 来说 只对表扫描一次即rows是列为9664782。
而对于
union
all
来说对表扫描了三次即rows的和为9664782*3。
这也是为什么我们看到
union
all
为几乎为三倍的原因。
备注:
如果使用存储过程使用第二sql该执行计划所有的type列 为
all
,其实这个是我最想演示的,但现在已经快写完毕了才发现问题将错就错呢。
3.1:不要迷信
union
all
就比 or及in 快,要结合实际情况分析到底使用哪种情况。
3.2:对于索引列来最好使用
union
all
,因复杂的查询【包含运算等】将使or、in放弃索引而全表扫描,除非你能确定or、in会使用索引。
3.3:对于只有非索引字段来说你就老老实实的用or 或者in,因为 非索引字段本来要全表扫描而
union
all
只成倍增加表扫描的次数。
3.4:对于及有索引字段【索引字段有效】又包含非索引字段来时,按理你也使用or 、in或者
union
all
都可以,
但是我推荐使用or、in。
如以下查询: