欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

如何構建高性能MySQL索引?

李中冰2年前13瀏覽0評論

謝邀~

之前寫過一篇關于針對開發人員數據庫優化的文章,索引也是其中之一,那么今天就針對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;
  • 索引不是越多越好。

我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。