點擊上方“Coder編程”,選擇“置頂公衆號”
技術文章第一時間送達!
索引設計規範
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~
我知道你 “在看”