MySQL中使用or、in与union all在查询命令下的效率对比 |
OR、in和union all 查询效率到底哪个快? EXPLAIN SELECT * from employees where employees.first_NAME =Georgi UNION ALL SELECT * from employees where employees.first_NAME =Bezalel 这条语句执行结果481条,执行时间为0.35s PRIMARY employees ALL 300141 Using where UNION employees ALL 300141 Using where UNION RESULT <union1,2> ALL explain SELECT * FROM employees WHERE employees.first_name IN (Georgi,Bezalel) 这条语句的执行结果时间为0.186s SIMPLE employees ALL 300141 Using where explain SELECT * FROM employees WHERE employees.first_name =Georgi or employees.first_name=Bezalel 这条语句的执行结果和in的结果差不多 难道是网上的说法有误?难道和索引有关?在firstname上建立了一个索引 重新执行 union的执行执行计划如下,执行时间为0.004s PRIMARY employees ref index_firstname index_firstname 44 const 253 Using where UNION employees ref index_firstname index_firstname 44 const 228 Using where UNION RESULT <union1,2> ALL in的执行计划如下,执行时间也为0.004s SIMPLE employees range index_firstname index_firstname 44 481 Using where or的执行计划如下,执行时间也为0.004s SIMPLE employees range index_firstname index_firstname 44 481 Using where 感觉性能差不多啊 。但是注意执行计划中的type,ref要好于range哦(ref为非唯一性索引扫描,range为索引范围扫描) 要不我再试试主键,这个是唯一的,会不会和网上的效果一直呢? EXPLAIN SELECT * FROM employees WHERE employees.EMP_NO=100001 UNION ALL SELECT * FROM employees WHERE employees.EMP_NO=101100 union的执行计划如下 PRIMARY employees const PRIMARY PRIMARY 4 const 1 UNION employees const PRIMARY PRIMARY 4 const 1 UNION RESULT <union1,2> ALL EXPLAIN SELECT * FROM employees WHERE employees.EMP_NO IN (100001 ,101100) in的执行计划如下 SIMPLE employees range PRIMARY PRIMARY 4 2 Using where EXPLAIN SELECT * FROM employees WHERE employees.EMP_NO=100001 OR emp_no=101100 or的执行计划如下 SIMPLE employees range PRIMARY PRIMARY 4 2 Using where 感觉结果和第二个实验还是差不多 。
drop table if EXISTS BT; create table BT( ID int(10) NOT NUll, VName varchar(20) DEFAULT NOT NULL, PRIMARY key( ID ) )ENGINE=INNODB; 该表只有两个字段 ID为主键【索引页类似】,一个是普通的字段 。(偷懒就用简单的表结构呢) INSERT INTO BT ( ID,VNAME ) VALUES( i, CONCAT( M, i ) );---1 修改为 INSERT INTO BT ( ID,VNAME ) VALUES( i, CONCAT( M, i, TT ) );---2 修改原因在 DROP PROCEDURE IF EXISTS test_proc; CREATE PROCEDURE test_proc() BEGIN declare i int default 0; set autocommit = 0; while i<10000000 do INSERT INTO BT ( ID,VNAME ) VALUES( i, CONCAT( M, i ) ); set i = i+1; if i%2000 = 0 then commit; end if; end while; END; 就不写注释呢,挺简单的 。 2:实战 时间都为0.00,怎么会这样呢,呵呵所有查询都是在毫秒级别 。 这里要注意的字段type 与ref字段 我们发现为啥union all查询时间几乎为 or 和in的三倍 。 这里我们发现计划几乎一样 。 3:总结 select * from bt where bt.VName = M98 or bt.id =9888589 select * from bt where bt.VName = M98 UNION ALL select * from bt where bt.id = 9888589 该两个查询速度相差多少 主要取决于 索引列查询时长,如索引列查询时间太长的话,那你也用or或者in代替吧 。 |