MySQL索引列沒有走索引?


問:為什么在重復性高的字段建索引提高的效率不高。可能反而會降低查找速度?

看如下例子:

表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; 如果此時去 走索引開銷 同樣 比不走索引要大。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM