加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL数据库mysql中or效率高还是in效率高

发布时间:2020-12-12 00:48:06 所属栏目:MySql教程 来源:网络整理
导读:《MYSQL数据库mysql中or效率高还是in效率高》要点: 本文介绍了MYSQL数据库mysql中or效率高还是in效率高,希望对您有用。如果有疑问,可以联系我们。 导读:很多时候在数据库查询的时候,需要时使用or或者in来查询数据,那这两个在数据库量很大的情况下谁的效

《MYSQL数据库mysql中or效率高还是in效率高》要点:
本文介绍了MYSQL数据库mysql中or效率高还是in效率高,希望对您有用。如果有疑问,可以联系我们。

导读:很多时候在数据库查询的时候,需要时使用or或者in来查询数据,那这两个在数据库量很大的情况下谁的效率会更高一点.今天刚好有时间决定对心... 很多时候在数据库查询的时候,那这两个在数据库量很大的情况下谁的效率会更高一点.

今天刚好有时间决定对心中的疑惑进行测试,下面是详细的测试过程.

第一步,创建测试表,并生成测试数据,测试数据为1000万条记录.数据库版本为5.1.63.数据库中关闭了query cache,因此数据库缓存不会对查询造成影响.具体的代码如下:

  1. #创建测试的test表?
  2. DROP?TABLE?IF?EXISTS?test;??
  3. CREATE?TABLE?test(??
  4. ????ID?INT(10)?NOT?NULL,??
  5. ????`Name`?VARCHAR(20)?DEFAULT?''?NOT?NULL,??
  6. ????PRIMARY?KEY(?ID?)??
  7. )ENGINE=INNODB?DEFAULT?CHARSET?utf8;??
  8. ?
  9. #创建生成测试数据的存储过程?
  10. DROP?PROCEDURE?IF?EXISTS?pre_test;??
  11. DELIMITER?//?
  12. CREATE?PROCEDURE?pre_test()??
  13. BEGIN??
  14. DECLARE?i?INT?DEFAULT?0;??
  15. SET?autocommit?=?0;??
  16. WHILE?i<10000000?DO??
  17. INSERT?INTO?test?(?ID,`Name`?)?VALUES(?i,?CONCAT(?'Carl',?i?)?);??
  18. SET?i?=?i+1;??
  19. IF?i%2000?=?0?THEN??
  20. COMMIT;??
  21. END?IF;??
  22. END?WHILE;??
  23. END;?//?
  24. DELIMITER?;?
  25. ?
  26. #执行存储过程生成测试数据?
  27. CALL?pre_test();?

第二步:分三中情况进行测试,分别是:
第一种情况: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列为一般索引的情况,执行的时间也基本没有区别.
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列没有索引的情况,执行的时间也基本没有区别.
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数据库

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读