咱們知道,在進行數據庫的查詢時候,若是加入了索引,將會大大提高查詢的效率,可是,在不少的時候,即便加上了索引也會有索引失效的時候。數據庫
今天,咱們主要來看這樣一種狀況: 查詢的數據庫條數過多的時候設計
首先,咱們先在數據庫裏建立一張表: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的記錄,看插入多少數據的時候會再次走索引,也就知道了本身安裝的數據庫不走索引的臨界值是多少了。