咱们知道,在进行数据库的查询时候,若是加入了索引,将会大大提高查询的效率,可是,在不少的时候,即便加上了索引也会有索引失效的时候。数据库
今天,咱们主要来看这样一种状况: 查询的数据库条数过多的时候设计
首先,咱们先在数据库里建立一张表:code
create table t ( id int PRIMARY KEY AUTO_INCREMENT, name varchar (20), score int );
blog
<br/>咱们再向表里插入一些数据:索引
insert into t (name, score) VALUES ('Lily', 11),('Mike',88),('Candy',38),('Job', 34),('Bob',56),('David',44);
咱们再在score字段加上索引:io
alter table t add index idx_score (score);
咱们若是想查出得分在56的人,咱们用执行计划执行下:table
EXPLAIN select * from t where score = 56;
得出结果以下: 效率
很明显,由于咱们在score字段加上了索引,因此咱们在进行查找的时候,就会使用到相关的索引。select
但若是咱们想要查找分数在56之下的数据,若是执行下,会有什么样的效果呢?执行以下:im
EXPLAIN select * from t where score = 56;
执行结果以下:
纳尼,为何在加上了索引以后,执行的时候却没有走索引呢?是否是数据库傻掉了呢?
放心,数据库并无傻掉,是由于数据库的大师们在设计数据库的时候,建立了这样一个机制,若是在执行的时候预判查出的数据占整张表数据量达到或大于20%,那么会认为这个时候走全表扫描更快一些,这个时候就不会走索引了。
那么为何会认为走全表扫描更快一些呢?咱们知道,经过建立的索引可以直接查到的并非数据库的全部记录,而是数据库中的主键,而后经过主键的位置去真正存储数据的地方去查找数据。那若是经过索引找到的数据过多,去数据库真正存储数据的地方查询的次数就越多,那么就要进行频繁的寻址与io操做,那这个时候就不如进行全表扫描来的快。
若是有兴趣,你们能够把原有的表里插入一部分大于56的数据,而后再用查询计划查找小于56的记录,看插入多少数据的时候会再次走索引,也就知道了本身安装的数据库不走索引的临界值是多少了。