mysql中or和in的效率问题
来源:互联网 发布:去向分布图用什么软件 编辑:程序博客网 时间:2024/06/06 00:21
在网上一直看到的是or和in的效率没啥区别,一直也感觉是这样,前几天刚好在看《mysql数据库开发的36条军规》的文章,里面提到了or和in的效率问题,文中提到or的效率为O(n),而in的效率为O(logn), 当n越大的时候效率相差越明显。
今天进行一个测试,分如下case:
第一种情况:in和or所在列为主键的情形。
第二种情况:in和or所在列创建有索引的情形。
第二种情况:in和or所在列没有索引的情形。
每种情况又采用不同的in和or的数量进行测试。由于测试语句的数据量有4种情况,我这里就称为A组、B组、C组、D组,其中A组为3个值,B组为150个值,C组为300个值,D组为1000个值。
测试结果如下:
第一种情况,ID列为主键的情况,4组测试执行计划一样,执行的时间也基本没有区别。
A组or和in的执行时间: or的执行时间为:0.002s in的执行时间为:0.002s
B组or和in的执行时间: or的执行时间为:0.004s in的执行时间为:0.004s
C组or和in的执行时间: or的执行时间为:0.006s in的执行时间为:0.005s
D组or和in的执行时间: or的执行时间为:0.018s in的执行时间为:0.014s
第二种情况,ID列为一般索引的情况,4组测试执行计划一样,执行的时间也基本没有区别。
A组or和in的执行时间: or的执行时间为:0.002s in的执行时间为:0.002s
B组or和in的执行时间: or的执行时间为:0.006s in的执行时间为:0.005s
C组or和in的执行时间: or的执行时间为:0.008s in的执行时间为:0.008s
D组or和in的执行时间: or的执行时间为:0.021s in的执行时间为:0.020s
第三种情况,ID列没有索引的情况,4组测试执行计划一样,执行的时间也基本没有区别。
A组or和in的执行时间: or的执行时间为:5.016s in的执行时间为:5.071s
B组or和in的执行时间: or的执行时间为:1min 02s in的执行时间为:5.018s
C组or和in的执行时间: or的执行时间为:1min 55s in的执行时间为:5.018s
D组or和in的执行时间: or的执行时间为:6min 17s in的执行时间为:5.057s
结论:
从上面的测试结果,可以看出如果in和or所在列有索引或者主键的话,or和in没啥差别,执行计划和执行时间都几乎一样。如果in和or所在列没有索引的话,性能差别就很大了。在没有索引的情况下,随着in或者or后面的数据量越多,in的效率不会有太大的下降,但是or会随着记录越多的话性能下降非常厉害,从第三中测试情况中可以很明显地看出了,基本上是指数级增长。
因此在给in和or的效率下定义的时候,应该再加上一个条件,就是所在的列是否有索引或者是否是主键。如果有索引或者主键性能没啥差别,如果没有索引,性能差别不是一点点!
- mysql中or和in的效率问题
- mysql中or和in的效率问题
- mysql中or和in的效率问题
- mysql中or和in的效率问题
- mysql中or和in的效率问题
- mysql中or和in的效率问题
- mysql中or和in的效率问题
- mysql中or和in的效率问题
- mysql中or和in的效率问题
- mysql中or和in的效率问题
- mysql中or和in的效率测试
- mysql中or和in的效率问题 (有无索引差别很大o(n)/log(n))
- 优化mysql中where or和where in语句的效率
- mysql in的效率问题
- OR和IN的执行效率
- mysql中in的效率
- mysql exists和in效率问题
- mysql between and 和in效率问题
- Qt/C++ 网易云api 在线播放音乐
- 1.2链式结构 实现 C = A U B
- Android测试有用工具笔记
- POJ 3525 二分答案,推进多边形和半平面交
- eclipse运行maven install报错
- mysql中or和in的效率问题
- HTML和HTML5的学习
- 栈的应用
- 一些关于dagger2的理解(二)
- 第十二周实践项目课后————4
- Python 资源大全
- iOS设置状态栏
- 150. Evaluate Reverse Polish Notation【M】【19】
- Unity 脚本 自动添加 脚本信息