Mysql索引使用的正確姿勢

今天給大家簡單的介紹一下mysql的索引用法,像在我們日常業務開發中,最核心的其實就是寫SQL命令,但是你寫的SQL真的用到索引了嗎?

索引實現原理

mysql數據庫索引實現是在存儲引擎中完成的,今天主要以InnoDB存儲引擎爲例給大家介紹一下。InnoDB存儲引擎索引的實現採用B+樹數據結構,今天我們主要講應用,如果想要深究原理的童鞋,可以自己研究研究。

索引失效

索引失效的場景,基本屬於老生常談了,我這邊就再囉嗦一遍:

  1. 少用or,用它來連接時索引會失效。
  2. like查詢以%開頭。
  3. 字符串不加單引號索引失效。
  4. 如果mysql估計使用全表掃描要比使用索引快,則不使用索引。
  5. 在MYSQL使用不等於(<,>,!=)的時候無法使用索引,會導致索引失效。
  6. is null或者is not null 也會導致無法使用索引。
  7. 不在索引列上做任何操作(計算,函數,(自動或者手動)類型裝換),會導致索引失效而導致全表掃描。
  8. 最佳左前綴法則——如果索引了多列,要遵守最左前綴法則。

索引優化原則

給需要的字段加索引

一般需要加索引的都是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用法,這節課暫時不多說,更多的內容我會在下一章中給大家詳細介紹。

image

總結:

索引的內容當然不僅僅只有這些,索引用的好可以成倍的提高執行效率,但是如果用的不好,還不如不用索引。因爲索引如果沒生效,那加索引只會給數據庫造成額外的負擔。

想要更多幹貨、技術猛料的孩子,快點拿起手機掃碼關注我,我在這裏等你哦~

林老師帶你學編程https://wolzq.com

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