文章目錄
- 前言
- 什么時候需要(不需要))使用索引?
- 有哪些優化索引的方法
- 前綴索引優化
- 索引覆蓋優化
- 索引失效場景
- 總結
前言
今天來講一講 MySQL 索引的高頻面試題。主要是針對前一篇文章 MySQL索引入門(一文搞定)進行查漏補缺,建議大家看完前一篇再看這一篇。
什么時候需要(不需要))使用索引?
我們先來看看索引的優缺點吧。
優點:可以快速查詢的效率,查詢是在增刪改查中最經常使用。
缺點:創建索引是要用到物理空間的。其次維護索引,當數據庫進行增刪改的時候,索引也要動態的進行變化。這樣子的話過多的索引會影響到數據庫的增刪改性能。
從優缺點我們來切入什么需要使用索引,什么時候不需要索引
什么時候需要使用索引?
- 當字段經常出現在 where 當做條件中,我們可以考慮根據字段添加索引。
- 當字段經常出現在 order By 和 Group By 時,我們可以考慮根據字段添加索引。
- 當字段頻繁的查詢,而少更新時,我們可以考慮根據字段添加索引。
什么時候不需要使用索引?
-
反之,將字段頻繁的更新時,不需要使用索引,因為索引的意義就是加速查詢,既然用不上就不需要創建了。
-
當數據量少時,不用因為查詢性能慢而煩惱時,就不需要使用索引。
-
當字段經常設計計算、函數等操作時,不需要使用索引,因為這會造成索引失效。
-
當有 where,order by ,group by 等關鍵詞使用不到的字段,不需要使用索引,因為索引的價值是快速定位,這樣子的話提現不出價值而且索引會占用物理空間。
-
當有字段存儲了大量的重復數據時,不需要創建索引,比如性別,只有男/女兩種值,這時候的索引是起不到作用的。因為MySQL 有個優化器會在執行前將SQL進行優化,如果有太多重復的數據,優化器默認是不會使用索引的。
有哪些優化索引的方法
前綴索引優化
前綴索引優化就是當類型為字符串(比如:varchar)的字段,該字段過長時,我們可以使用前綴索引就是將該字段的前幾個字符作為索引。
這樣子既可以節省空間,又可以起到索引優化查詢的性能。
當然這種也有缺點。
- order by 無法使用前綴索引
- 前綴索引無法起到索引覆蓋優化。
索引覆蓋優化
索引覆蓋優化一般是使用聯合索引,就是B+樹的葉子結點是包含索引(key)和數據(data)的。當使用聯合索引時
,如果聯合索引中的值包含了我們需要查詢的值,那么就不用進行回表查詢了。回表查詢就是根據這次查詢到的索引值再進行一次查詢。
比如學生表,我們要查詢出studentName,studentPhone,其中card(身份證卡號)是唯一值,我們創建聯合索引(card、studentName、studentPhone)。然后我們使用SQL語句進行查詢
select card,studentName, studentPhone from student where card = '445122335464654654463'
這樣子就是索引覆蓋優化拉。
索引失效場景
就不詳細解釋了,大家感興趣底層原理可以閱讀 “小林coding”的網站。
- 當like關鍵字進行左模糊(%xx)查詢和左右模糊(%xx%)查詢時會失效。因為索引是整個值,進行左模糊的話無法匹配出來。
- 當索引字段進行計算,函數,類型轉化時,會出現索引失效。
- 當聯合索引不符合最左匹配原則時會出現索引失效。
- where 條件字段中,如果 OR 前字段是索引列,后字段不是,會索引失效。
總結
總的來說,我們只要符合索引的優缺點就可以知道索引該如何使用拉。優點:快速查詢,缺點:浪費空間,影響數據更新性能。
最后建議大家都可以去讀一讀 小林coding網站的索引篇,知道底層原理,知識才更牢固。
有啟發點個贊 🌹
好文章不要錯過,最近給大家分享的文章
MySQL的基礎知識
1.MySQL的基礎架構
2.SQL語句的執行流程
3.MySQL 的存儲引擎
MySQL 索引
1.MySQL索引入門(一文搞定)
預計下篇分享:MySQL 事務基礎知識
本篇參考:小林coding ,JavaGuide
我是小輝,正在進行 Java 實習的 24 屆應屆畢業生。歡迎關注,持續分享,包括但不限于技術文章。全網同名…