1. 程式人生 > >為什麼你建立的資料庫索引沒有生效

為什麼你建立的資料庫索引沒有生效

幾乎所有的小夥伴都可以隨口說幾句關於建立索引的優缺點,也知道什麼時候建立索引能夠提高我們的查詢效能,什麼時候索引會更新,但是你有沒有注意到,即使你設定了索引,有些時候索引他是不會生效的!這不僅考察了大家對索引的瞭解程度,還要讓大家在使用的時候能夠正確的使用。以下介紹了一些可能會造成索引失效的特殊情況,希望大家在平時開發和麵試的時候能夠注意到!

一、如何判斷資料庫索引是否生效

首先在接著探討之前,我們先說一下,如何判斷資料庫的索引是否生效!相信大家應該猜到了,就是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個數據塊,既然全表掃描訪問的資料塊少一些,肯定就不會利用索引了。

到此為止,大致探討了10個相關的可能造成索引失效的問題,也歡迎大家補充!

本次送書

內容提要:

《瘋狂Spring Cloud微服務架構實戰》以Spring Cloud為基礎,深入講解微服務開發的相關框架,包括服務管理框架Eureka、負載均衡框架Ribbon、服務客戶端Feign、容錯框架Hystrix、訊息框架Stream等。除了介紹這些微服務相關的框架外,在本書的第11章,還介紹瞭如何使用Spring Data框架操作各個主流資料庫(MySQL、MongoDB、Redis)。在第12章,以一個案例為基礎結束本書內容,在該章中講解了模板引擎Thymeleaf,整本書將會為大家提供一整套微服務應用開發的解決方案。

2018年

03月15日

電子工業出版社 | 博文視點

本次活動贊助商

博文視點(Broadview)在IT出版領域打磨多年,以敏銳眼光、獨特視角密切關注技術發展趨勢及變化,致力於將技術大師之優秀思想、一線專家之一流經驗集結成書,為眾多愛學習的小夥伴奉獻精誠佳作,助力個人、團隊成長。

活動規則

為了照顧那些不想評論的小夥伴,這裡祭出抽獎二維碼,今天活動抽兩本,有興趣的可以掃碼參與!注意:中獎的小夥伴,一定要寫清楚收貨資訊,包括收貨人姓名、手機號碼、地址,否則作為棄權處理!

點選圖片檢視更多推薦內容

↓↓↓

面試必備:什麼是一致性Hash演算法?

快取雪崩、快取穿透、快取預熱、快取更新、快取降級等問題!

為什麼說Redis是單執行緒的?

為什麼MySQL資料庫索引選擇使用B+樹?