时间:2021-07-01 10:21:17 帮助过:62人阅读
(0) select * from mytable where a=3 and b=5 and c=4; abc三个索引都在where条件里面用到了,而且都发挥了作用 (1) select * from mytable where c=4 and b=6 and a=3; 这条语句列出来只想说明 mysql没有那么笨,where里面的条件顺序在查询之前会被mysql自动优化,效果跟上一句一样 (2) select * from mytable where a=3 and c=7; a用到索引,b没有用,所以c是没有用到索引效果的 (3) select * from mytable where a=3 and b>7 and c=3; a用到了,b也用到了,c没有用到,这个地方b是范围值,也算断点,只不过自身用到了索引 (4) select * from mytable where b=3 and c=4; 因为a索引没有使用,所以这里 bc都没有用上索引效果 (5) select * from mytable where a>4 and b=7 and c=9; a用到了 b没有使用,c没有使用 (6) select * from mytable where a=3 order by b; a用到了索引,b在结果排序中也用到了索引的效果,前面说了,a下面任意一段的b是排好序的 (7) select * from mytable where a=3 order by c; a用到了索引,但是这个地方c没有发挥排序效果,因为中间断点了,使用 explain 可以看到 filesort (8) select * from mytable where b=3 order by a; b没有用到索引,排序中a也没有发挥索引效果
补充一个:
快速生成1000W测试数据库;
创建测试表:
create table user ( id int(10) not null auto_increment, uname varchar(20) , regtime char(30) , age int(11) , primary key (id) ) engine=myisam default charset=utf8 collate=utf8_general_ci , auto_increment=1 ;
编写存储过程:
delimiter $$ SET AUTOCOMMIT = 0$$ create procedure test() begin declare v_cnt decimal (10) default 0 ; dd:loop insert into user values (null,rand()*10,now(),rand()*50), (null,rand()*10,now(),rand()*50), (null,rand()*10,now(),rand()*50), (null,rand()*10,now(),rand()*50), (null,rand()*10,now(),rand()*50), (null,rand()*10,now(),rand()*50), (null,rand()*10,now(),rand()*50), (null,rand()*10,now(),rand()*50), (null,rand()*10,now(),rand()*50), (null,rand()*10,now(),rand()*50); commit; set v_cnt = v_cnt+10 ; if v_cnt = 10000000 then leave dd; end if; end loop dd ; end;$$ delimiter ;
调用存储过程:
call test();
mysql 多列索引的生效规则
标签:iter 调用 set char isa 过程 补充 end 分析