mysql數據庫索引爲何失效--你查的太多了

咱們知道,在進行數據庫的查詢時候,若是加入了索引,將會大大提高查詢的效率,可是,在不少的時候,即便加上了索引也會有索引失效的時候。數據庫

今天,咱們主要來看這樣一種狀況: 查詢的數據庫條數過多的時候設計

首先,咱們先在數據庫裏建立一張表: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的記錄,看插入多少數據的時候會再次走索引,也就知道了本身安裝的數據庫不走索引的臨界值是多少了。

相關文章
相關標籤/搜索