問:為什么在重復性高的字段建索引提高的效率不高。可能反而會降低查找速度?
看如下例子:
表A (ID,col1,col2,col3,col4,..col100) 100個字段,現在COL4上創建索引,而COL4中所有的值都為1;
update a set col4=1 ,10000條記錄,COL4都是1。
如果你查詢 select * from A where col4=1; MYSQL就不會再去走索引。
因為如果走索引反而速度慢。 MYSQL會自行判斷是否需要使用索引。這也是為什么經常會看到EXPLAIN中明明有索引,但並未被使用。
為什么走索引反而更慢?
先理解普通索引,主鍵索引,回表
普通索引:創建索引后數據庫會創建一個普通索引樹,普通索引樹存的是索引列的值和主鍵ID的值。
主鍵索引:創建表時,不管有沒有指定主鍵,mysql innodb會默認創建一個主鍵索引和主鍵索引樹。
主鍵索引樹存的是主鍵列的值和整行的數據值。這里主鍵默認為ID
理解回表:where name = "zhangs" ;主鍵ID,普通索引列name;
這條sql執行時,數據庫引擎會在普通索引列上找到name=zhangs的那個節點數據中id的值為多少,如id=30
再根據ID的值,去主鍵索引樹上查找到id=30的那一列,這個過程叫回表。
查詢到結果后返回。
為什么會慢的原因:
(正常情況下查詢時,數據庫存儲引擎會根據普通索引查找到數據(這個數據數據是主鍵id的值),
根據查到的數據去主鍵索引樹上進行查找到相應的行(過程叫回表),每行中有所有列的數據,
當COL4所有值都是1時,是把所有列的數據都進行了一次回表,比全表掃描多一次回表(如10000條數據,就多回表了10000次))
同樣。即使 update a set col4=0 where id=10, 這樣, 僅ID=10的記錄COL4=0,而其余9999條記錄仍是COL4=1。
同樣select * from A where col4=1; 如果此時去 走索引開銷 同樣 比不走索引要大。