謝邀~
之前寫過一篇關于針對開發人員數據庫優化的文章,索引也是其中之一,那么今天就針對Mysql索引講幾點。
索引的類型及什么時候建立索引
說到MySQL的索引,大多數時候都是指B-Tree索引,MySQL大部分引擎都是支持B-Tree索引的。B-Tree索引適用于全鍵值、范圍、前綴的查找;
主鍵、外鍵必須有索引,當然很多系統都是邏輯外鍵(或需要經常和其他表關聯),也需要建立索引;經常出現在where、orderby、groupby中的字段;盡量把索引建立到小字段上;對于文本字段或者很長字段,不要建索引;復合索引,文章第二部分再說明;
哈希索引,是基于哈希表,精確匹配索引所有列的查詢才有效;只有Memory引擎支持。
全文索引、聚簇索引、聚簇索引等等,就不詳細說了,因為...我也不太會,下面還是主要說B-Tree索引(后來說的索引,都是指B-Tree)。
聯合索引的限制
很多同學都喜歡給多個字段建立聯合索引,那么建立聯合索引需要注意些什么呢:
索引的最左原則,如果不是按索引的最左列查找,那么將無法使用索引。最左原則:如果創建了一個聯合索引(name,age,gender),相當于創建了三個索引(name)、(name,age)、(name,age,gender)。
聯合索引,左邊的列有范圍查找,那么右邊的列無法使用索引。比如index(age,gender),whereage>20andgender='M';這時候就會有問題。解決辦法也很簡單,兩個字段分別建立索引。
索引的一些小技巧
- 前導模糊查詢,會導致索引失效:wherenamelike'%三豐';
- 數據區分度不大,不建議使用索引:wheregender='M';性別只有男、女、未知三種;
- 等號左邊有函數,會索引失效:whereLENGTH(col1)=10;
- 隱式轉換的問題:wherecol2='100',col2列是數字,等號左右類型不一致,col2會隱式轉換成字符串;
- 盡量不好使用負向查詢,例如:!=、notin、notexists;
- 索引不是越多越好。