MySQL索引

透明表索引有兩種:分別是主索引和二級索引。

  • 主索引是在我們創建表激活後由系統自動創建的,這個我們不能修改;二級索引可以我們自己創建。
  • 主索引是表的主鍵,二級索引可以根據你自己需要用到表的任何字段的組合來創建。
  • 在使用二級索引時,WHERE條件字段和字段順序要與二級索引字段和字段順序粗略一致,這樣才能提高檢索效率

 

一、如何判斷數據庫索引是否生效

首先在接着探討之前,我們先說一下,如何判斷數據庫的索引是否生效!相信大家應該猜到了,就是explain!explain顯示了MySQL如何使用索引來處理select語句以及連接表。他可以幫助選擇更好的索引和寫出更優化的查詢語句。

例如我們有一張表user,爲name列創建索引name_index,如下所示:  

 

使用explain分析語句如下:

可以看到,使用explain顯示了很多列,各個關鍵字的含義如下:

  • table:顧名思義,顯示這一行的數據是關於哪張表的;
  • type:這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型爲:const、eq_reg、ref、range、indexhe和ALL;
  • possible_keys:顯示可能應用在這張表中的索引。如果爲空,沒有可能的索引。可以爲相關的域從where語句中選擇一個合適的語句;
  • key: 實際使用的索引。如果爲NULL,則沒有使用索引。很少的情況下,MySQL會選擇優化不足的索引。這種情況下,可以在Select語句中使用USE INDEX(indexname)來強制使用一個索引或者用IGNORE INDEX(indexname)來強制MySQL忽略索引;
  • key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好;
  • ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數;
  • rows:MySQL認爲必須檢查的用來返回請求數據的行數;
  • Extra:關於MySQL如何解析查詢的額外信息。

具體的各個列所能表示的值以及含義可以參考MySQL官方文檔介紹,地址:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

 

二、哪些場景會造成索引生效

1、應儘量避免在 where 子句中使用 != 或 <> 操作符,否則引擎將放棄使用索引而進行全表掃描;

2、儘量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,即使其中有條件帶索引也不會使用,這也是爲什麼儘量少用 or 的原因;

3、對於多列索引,不是使用的第一部分,則不會使用索引;

4、如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不會使用索引;

5、like的模糊查詢以 % 開頭,索引失效;

6、應儘量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描;

7、應儘量避免在 where 子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描;

 

8、不要在 where 子句中的 “=” 左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引;

9、如果MySQL估計使用全表掃描要比使用索引快,則不使用索引;

10、不適合鍵值較少的列(重複數據較多的列)

假如索引列TYPE有5個鍵值,如果有1萬條數據,那麼 WHERE TYPE = 1將訪問表中的2000個數據塊。再加上訪問索引塊,一共要訪問大於200個的數據塊。如果全表掃描,假設10條數據一個數據塊,那麼只需訪問1000個數據塊,既然全表掃描訪問的數據塊少一些,肯定就不會利用索引了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章