如何構建高性能MySQL索引?

花花心心


之前寫過一篇關於針對開發人員數據庫優化的文章,索引也是其中之一,那麼今天就針對Mysql索引講幾點。

索引的類型及什麼時候建立索引

  • 說到MySQL的索引,大多數時候都是指B-Tree索引,M\rySQL大部分引擎都是支持B-Tree索引的。B-Tree索引適用於全鍵值、範圍、前綴的查找;

  • 主鍵、外鍵必須有索引,當然很多系統都是邏輯外鍵(或需要經常和其他表關聯),也需要建立索引;經常出現在where、order by、group by中的字段;儘量把索引建立到小字段上;對於文本字段或者很長字段,不要建索引;複合索引,文章第二部分再說明;

  • 哈希索引,是基於哈希表,精確匹配索引所有列的查詢才有效;只有Memory引擎支持。

  • 全文索引、聚簇索引、聚簇索引等等,就不詳細說了,因為...我也不太會,下面還是主要說B-Tree索引(後來說的索引,都是指B-Tree)。

聯合索引的限制

很多同學都喜歡給多個字段建立聯合索引,那麼建立聯合索引需要注意些什麼呢:

  • 索引的最左原則,如果不是按索引的最左列查找,那麼將無法使用索引。最左原則:如果創建了一個聯合索引(name,age,gender),相當於創建了三個索引(name)、(name,age)、(name,age,gender)。

  • 聯合索引,左邊的列有範圍查找,那麼右邊的列無法使用索引。比如index(age,gender),where age > 20 and gender = 'M';這時候就會有問題。解決辦法也很簡單,兩個字段分別建立索引。

索引的一些小技巧

  • 前導模糊查詢,會導致索引失效:where name like '%三豐';
  • 數據區分度不大,不建議使用索引:where gender = 'M';性別只有男、女、未知三種;
  • 等號左邊有函數,會索引失效:where LENGTH(col1) = 10;
  • 隱式轉換的問題:where col2 = '100',col2列是數字,等號左右類型不一致,col2會隱式轉換成字符串;
  • 儘量不好使用負向查詢,例如:!=、not in、not exists;
  • 索引不是越多越好。

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


會點代碼的大叔


第一步、

肯定要從業務背景開始出發啦。

比如業務信息是需要一個產品表,裡面需要保存產品名稱,產品庫存,產品價格,產品分類,是否顯示,備註信息。

轉換成sql代碼:

CREATE TABLE `product` (

`id` bigint(0) UNSIGNED NOT NULL AUTO_INCREMENT,

`productName` varchar(64) NULL,

`numCount` int(10) NULL,

`price` decimal(10, 2) UNSIGNED NULL,

`productClass` varchar(32) NULL,

`isShow` int(1) UNSIGNED NULL DEFAULT 1 COMMENT '0隱藏,1顯示',

`remark` varchar(255) NULL,

PRIMARY KEY (`id`),

INDEX `web_show`(`productClass`, `isShow`),

INDEX `web_search`(`productName`, `numCount`, `Price`, `productClass`, `isShow`)

);

首先,web_show這個索引代表著可能頁面會根據產品分類和是否顯示進行分類查詢,所以建立一個索引。

web_search 則代表在產品搜索頁面,通過productName和numCount還有Price和productClass進行篩選,原則上isShow代表是否顯示默認都需要的。


第二步、

若後期業務增加,或執行sql的方式不一樣,通過desc select ****方式,來查看SQL執行過程,通過執行過程在對應地創建索引即可。


另外索引並非越多越好,需要合適地創建


賣女孩的小男孩M


很多人覺得可以把where條件裡的字段全部加上索引。

其實這種做法時非常錯誤的。盲目地加索引或許能夠早一定程度上加快查詢速度,但是也有可能會大大降低數據的寫入操作。

在《高性能MySQL》中,講到索引時,介紹了一種“三星系統”。

索引將相關的記錄放到一起則獲得一星;

如果索引中的數據順序和查找中的排列順序一致則獲得二星;

如果索引中的列包含了查詢中需要的全部列則獲得三星;


碼工小班


這個問題可以看下,我已經發表的一篇文章,裡面講到如何設計高性能的索引

https://www.toutiao.com/i6637764918164587021/


程序界小哥


構建索引是一個長期的過程,需要不斷重構,而達到最優,常見索引有單值索引,唯一索引,複合索引能滿足很多場景的需求。如果是MySQL數據庫,配合explain+SQL語句可以看到MySQL認為最優的執行計劃,從而發現性能的瓶頸,如果是Oracle可以使用PL/SQL等工具查看執行計劃,兩者基本大同小異,具體問題,具體分析哈😀😀😀


分享到:


相關文章: