[Mysql教程系列]介紹一下MySQL索引設計規範

點擊上方“Coder編程”,選擇“置頂公衆號”

技術文章第一時間送達!

mysql.jpg

索引設計規範

MySQL的查詢速度依賴良好的索引設計,因此索引對於高性能至關重要。合理的索引會加快查詢速度(包括UPDATE和DELETE的速度,MySQL會將包含該行的page加載到內存中,然後進行UPDATE或者DELETE操作),不合理的索引會降低速度。MySQL索引查找類似於新華字典的拼音和部首查找,當拼音和部首索引不存在時,只能通過一頁一頁的翻頁來查找。當MySQL查詢不能使用索引時,MySQL會進行全表掃描,會消耗大量的IO。索引的用途:去重、加速定位、避免排序、覆蓋索引。

什麼是覆蓋索引?

InnoDB存儲引擎中,secondary index(非主鍵索引)中沒有直接存儲行地址,存儲主鍵值。如果用戶需要查詢secondary index中所不包含的數據列時,需要先通過secondary index查找到主鍵值,然後再通過主鍵查詢到其他數據列,因此需要查詢兩次。覆蓋索引的概念就是查詢可以通過在一個索引中完成,覆蓋索引效率會比較高,主鍵查詢是天然的覆蓋索引。合理的創建索引以及合理的使用查詢語句,當使用到覆蓋索引時可以獲得性能提升。比如SELECT email,uid FROM user_email WHERE uid=xx,如果uid不是主鍵,適當時候可以將索引添加爲index(uid,email),以獲得性能提升。

索引的基本規範

1、索引數量控制,單張表中索引數量不超過5個,單個索引中的字段數不超過5個。

  • 綜合評估數據密度和分佈

  • 考慮查詢和更新比例

爲什麼一張表中不能存在過多的索引?

InnoDB的secondary index使用b+tree來存儲,因此在UPDATE、DELETE、INSERT的時候需要對b+tree進行調整,過多的索引會減慢更新的速度。

2、對字符串使用前綴索引,前綴索引長度不超過8個字符,建議優先考慮前綴索引,必要時可添加僞列並建立索引。

  • 不要索引blob/text等字段,不要索引大型字段,這樣做會讓索引佔用太多的存儲空間

什麼是前綴索引?

前綴索引說白了就是對文本的前幾個字符(具體是幾個字符在建立索引時指定)建立索引,這樣建立起來的索引更小,所以查詢更快。前綴索引能有效減小索引文件的大小,提高索引的速度。但是前綴索引也有它的壞處:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前綴索引,也不能把它們用作覆蓋索引(Covering Index)。

建立前綴索引的語法:ALTER TABLE table_name ADD KEY(column_name(prefix_length));

3、主鍵準則

  • 表必須有主鍵

  • 不使用更新頻繁的列

  • 儘量不選擇字符串列

  • 不使用UUID MD5 HASH

  • 默認使用非空的唯一鍵

  • 建議選擇自增或發號器

4、 重要的SQL必須被索引,核心SQL優先考慮覆蓋索索引

  • UPDATE、DELETE語句的WHERE條件列

  • ORDER BY、GROUP BY、DISTINCT的字段

  • 多表JOIN的字段

5、區分度最大的字段放在前面

  • 選擇篩選性更優的字段放在最前面,比如單號、userid等,type,status等篩選性一般不建議放在最前面

  • 索引根據左前綴原則,當建立一個聯合索引(a,b,c),則查詢條件裏面只有包含(a)或(a,b)或(a,b,c)的時候才能走索引,(a,c)作爲條件的時候只能使用到a列索引,所以這個時候要確定a的返回列一定不能太多,不然語句設計就不合理,(b,c)則不能走索引

  • 合理創建聯合索引(避免冗餘),(a,b,c) 相當於 (a) 、(a,b) 、(a,b,c)

6、索引禁忌

  • 不在低基數列上建立索引,例如“性別”

  • 不在索引列進行數學運算和函數運算

  • 不要索引常用的小型表

7、 儘量不使用外鍵

  • 外鍵用來保護參照完整性,可在業務端實現

  • 對父表和子表的操作會相互影響,降低可用性

  • INNODB本身對online DDL的限制

MYSQL 中索引的限制

  • MYISAM 存儲引擎索引長度的總和不能超過 1000 字節

  • BLOB 和 TEXT 類型的列只能創建前綴索引

  • MYSQL 目前不支持函數索引

  • 使用不等於 (!= 或者 <>) 的時候, MYSQL 無法使用索引。

  • 過濾字段使用函數運算 (如 abs (column)) 後, MYSQL無法使用索引。

  • join語句中join條件字段類型不一致的時候MYSQL無法使用索引

  • 使用 LIKE 操作的時候如果條件以通配符開始 (如 ‘%abc…’)時, MYSQL無法使用索引。

  • 使用非等值查詢的時候, MYSQL 無法使用 Hash 索引。

推薦

文末

文章收錄至
Github: https://github.com/CoderMerlin/coder-programming
Gitee: https://gitee.com/573059382/coder-programming
歡迎關注並star~

微信公衆號

                    我知道你 “在看

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