天天看點

mysql增加索引不生效的幾種情況

增加索引可以提高查詢效率。

增加索引就是增加一個索引檔案,存放的是資料的位址,類似與我們文檔的目錄,在查找過程中可以不用從書的内容查找,直接根據目錄對應的頁碼查找。索引是根據位址查找。

建立索引,索引使用的資料結構也有很多種。常見的是B-tree,哈希等。mysql預設使用的資料庫索引是innerDB,innerDB的索引結構是B-tree。

但是在使用過程中哪些情況增加索引無法達到預期的效果呢?下面列舉幾種常見情況:

假設name age address 都已經加了索引。索引名字分别為 index_name,index_age,index_address。

用explain檢視SQL的執行計劃

執行計劃的 type

表示MySQL在表中找到所需行的方式,又稱“通路類型”,常見類型如下:

ALL, index,  range, ref, eq_ref, const, system, NULL
ALL:Full Table Scan, MySQL将周遊全表以找到比對的行
index:Full Index Scan,index與ALL差別為index類型隻周遊索引樹
range:索引範圍掃描,對索引的掃描開始于某一點,傳回比對值域的行。顯而易見的索引範圍掃描是帶有between或者where子句裡帶有<, >查詢。當mysql使用索引去查找一系列值時,例如IN()和OR清單,也會顯示range(範圍掃描),當然性能上面是有差異的。
ref:使用非唯一索引掃描或者唯一索引的字首掃描,傳回比對某個單獨值的記錄行
eq_ref:類似ref,差別就在使用的索引是唯一索引,對于每個索引鍵值,表中隻有一條記錄比對,簡單來說,就是多表連接配接中使用primary key或者 unique key作為關聯條件。
           

1、使用查詢多列使用or,type=all

mysql增加索引不生效的幾種情況

2、使用模糊查詢,type=all

mysql增加索引不生效的幾種情況

3、在加索引的字段上有運算

mysql增加索引不生效的幾種情況

4、如果列類型是字元串,需要使用引号引用起來。name字段是字元串類型

沒引号 type=all

mysql增加索引不生效的幾種情況

有引号 tye=ref

mysql增加索引不生效的幾種情況

首先mysql有個類型轉換規則就是将“字元轉成數字”,上面的sql是包含運算的:

explain SELECT name,age,address FROM user where cast(name as signed)= 10;

5、反向查詢區分情況

(not , not in, not like, <>, != ,!>,!< ) 使用索引效果

mysql增加索引不生效的幾種情況
mysql增加索引不生效的幾種情況
mysql增加索引不生效的幾種情況
mysql增加索引不生效的幾種情況
mysql增加索引不生效的幾種情況
mysql增加索引不生效的幾種情況
其他情況

1、聯合索引中關聯字段沒有使用相同的字元集;

2、聯合索引查詢時沒有用到第一個索引字段,即不滿足最左原則;

3、本身資料量很少,mysql會判斷是否需要使用索引;