《MYSQL数据库mysql中or效率高还是in效率高》要点:
本文介绍了MYSQL数据库mysql中or效率高还是in效率高,希望对您有用。如果有疑问,可以联系我们。
- #创建测试的test表
- DROP TABLE IF EXISTS test;
- CREATE TABLE test(
- ID INT(10) NOT NULL,
- `Name` VARCHAR(20) DEFAULT '' NOT NULL,
- PRIMARY KEY( ID )
- )ENGINE=INNODB DEFAULT CHARSET utf8;
- #创建生成测试数据的存储过程
- DROP PROCEDURE IF EXISTS pre_test;
- DELIMITER //
- CREATE PROCEDURE pre_test()
- BEGIN
- DECLARE i INT DEFAULT 0;
- SET autocommit = 0;
- WHILE i<10000000 DO
- INSERT INTO test ( ID,`Name` ) VALUES( i, CONCAT( 'Carl', i ) );
- SET i = i+1;
- IF i%2000 = 0 THEN
- COMMIT;
- END IF;
- END WHILE;
- END; //
- DELIMITER ;
- #执行存储过程生成测试数据
- 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列为一般索引的情况,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数据库
转载请注明本页网址:
http://www.vephp.com/jiaocheng/5797.html