今天給大家簡單的介紹一下mysql的索引用法,像在我們日常業務開發中,最核心的其實就是寫SQL命令,但是你寫的SQL真的用到索引了嗎?
索引實現原理
mysql數據庫索引實現是在存儲引擎中完成的,今天主要以InnoDB存儲引擎爲例給大家介紹一下。InnoDB存儲引擎索引的實現採用B+樹數據結構,今天我們主要講應用,如果想要深究原理的童鞋,可以自己研究研究。
索引失效
索引失效的場景,基本屬於老生常談了,我這邊就再囉嗦一遍:
- 少用or,用它來連接時索引會失效。
- like查詢以%開頭。
- 字符串不加單引號索引失效。
- 如果mysql估計使用全表掃描要比使用索引快,則不使用索引。
- 在MYSQL使用不等於(<,>,!=)的時候無法使用索引,會導致索引失效。
- is null或者is not null 也會導致無法使用索引。
- 不在索引列上做任何操作(計算,函數,(自動或者手動)類型裝換),會導致索引失效而導致全表掃描。
- 最佳左前綴法則——如果索引了多列,要遵守最左前綴法則。
索引優化原則
給需要的字段加索引
一般需要加索引的都是where中經常使用的字段,但是像性別這種屬性字段,加索引的意義不大,因爲性別這類字段選擇性太低(基礎/總數)。
如下所示,如果userinfo表中的數據90%以上,都是性別爲男的用戶,這個時候給sex字段加索引,收效甚微,
select sum(sex='男') as sexCount,sum(1) as countNum from userinfo
結果:
sexCount countNum
4 5
錯誤的爲每個列創建獨立索引
有些人可能會把where條件後面所有的字段都加上索引,但是後面卻會發現這樣做起到的效果收效甚微,這個時候我們因該優先使用聯合索引。
如下所示:雖然我給name和age都設置了索引,但是真正使用到的只有name索引。如果用戶表中存在大量名叫張三的用戶,那age就需要進行二次篩選,這就會耗費相當的資源。
select * from userinfo where name= '張三' and age=21
索引使用情況:
1 SIMPLE userinfo ref name,age name 768 const 1 33.33 Using where
如果我們給name+age設置聯合索引,我們就可以快速檢索到我們需要的數據,不需要進行二次篩選。
索引使用情況:
1 SIMPLE userinfo ref name_age name_age 773 const,const 1 100
正確使用聯合索引
聯合索引一定要注意索引順序,一般放在前面的都是選擇性比較高的索引字段。
例如一個用戶表,需要查詢手機號爲138+性別爲女的數據,如果是性別+手機號這樣的順序作爲聯合索引,就會導致第一次索引的數據很大,再用手機接着索引效率就會特別低,如果索引順序反過來就可以避免這類問題。
避免檢索全部
一定要避免select *from的出現,因爲這樣不僅不會用到覆蓋索引,而且數據傳輸也會耗費很長的時間。
如果select出來的字段都在where條件之內,這種情況就叫做覆蓋索引。覆蓋索引檢索出來的數據可以直接返回給前端,不需要通過id去查詢其它字段,所以效率更高。
order by排序字段注意重排序
使用索引字段來做排序,如果order by排序的字段不在索引中,則會導致數據重排,如果數據量較大會很耗費cpu性能。
如下所示,pwd字段不在索引裏面,就會導致Using filesort的出現。
EXPLAIN
select * from userinfo where name= '張三' and age=21 ORDER BY pwd;
索引使用情況:
1 SIMPLE userinfo ref name_age name_age 773 const,const 1 100 Using index condition; Using filesort
去除冗餘索引
去除不必要的冗餘索引,在添加索引的時候,可能有人不注意會設置重複的索引,像用戶名稱+年齡的聯合索引和用戶名稱的單列索引,就是典型的冗餘索引字段。
name_age name, age NORMAL 0 A 3 0
name name NORMAL 0 A 3 0
SQL索引檢查:
我們寫完SQL之後,要如何確定這條SQL有沒有用到索引,用到的索引具體是哪一個,不用着急,這邊我們可以用explain關鍵字來進行SQL索引分析。explain用法,這節課暫時不多說,更多的內容我會在下一章中給大家詳細介紹。
總結:
索引的內容當然不僅僅只有這些,索引用的好可以成倍的提高執行效率,但是如果用的不好,還不如不用索引。因爲索引如果沒生效,那加索引只會給數據庫造成額外的負擔。
想要更多幹貨、技術猛料的孩子,快點拿起手機掃碼關注我,我在這裏等你哦~
林老師帶你學編程:https://wolzq.com