一瓤球、InnoDB的索引模型
InnoDB 使用了 B+ 樹索引模型,能夠很好地配合磁盤的讀寫特性敏弃,減少單次查詢的磁盤訪問次數卦羡,所以數據都是存儲在 B+ 樹中 的。每一個索引在 InnoDB 里面對應一棵 B+ 樹。什么是B+樹
主鍵索引:
普通索引:
主鍵索引的葉子節(jié)點存的是整行數據(這就是為何不能重建或者刪除主鍵索引绿饵,相當于重建表了)欠肾,普通索引的葉子節(jié)點存儲的是主鍵的值。在InnoDb中拟赊,主鍵索引也被成為聚合索引刺桃;普通索引被稱為二級索引
主鍵索引與普通索引查詢有什么區(qū)別:
從圖中可以看出,主鍵查詢直接通過Id直接可以查詢到葉子節(jié)點的數據吸祟;而普通索引查詢則先得到Id再通過主鍵索引樹搜索一次瑟慈,這個過程稱為回表。
二屋匕、為何要使用自增主鍵
自增主鍵是指自增列上定義的主鍵葛碧,在建表語句中一般是這么定義的: NOT NULL PRIMARY KEY AUTO_INCREMENT。
1炒瘟、性能方面(時間):
B+ 樹為了維護索引有序性吹埠,在插入新值的時候需要做必要的維護第步。需要邏輯上挪動后面的數據疮装,空出位置。而更糟的情況是粘都,需插入的所在的數據頁已經滿了廓推,根據 B+ 樹的算法,這時候需要申請一個新 的數據頁翩隧,然后挪動部分數據過去樊展。這個過程稱為頁分裂。在這種情況下堆生,性能自然會受影響专缠。
除了性能外,頁分裂操作還影響數據頁的利用率淑仆。原本放在一個頁的數據涝婉,現在分到兩個頁中, 整體空間利用率降低大約 50%蔗怠。
當然有分裂就有合并墩弯。當相鄰兩個頁由于刪除了數據,利用率很低之后寞射,會將數據頁做合并渔工。合
并的過程,可以認為是分裂過程的逆過程桥温。
2引矩、存儲方面(空間):
主鍵長度越小,普通索引的葉子節(jié)點就越小,普通索引占用的空間也就越小脓魏。如果身份證坐主鍵兰吟,則普通索引的所占的空間比較大
什么情況下可以業(yè)務字段做索引,只有這個一個字段為主鍵索引茂翔。
三混蔼、索引查詢
- 最左前綴原則
B+樹可以利用索引的“最左前綴”,來定位記錄珊燎。最左前綴可以是聯(lián)合索引的最左N個字段惭嚣,也可以是字符串索引的最左M個字符
1、最左M個字符 如 like "a%"
2悔政、聯(lián)合索引最左N個字段晚吞,盡可能的少維護索引。如有(a,b)則所以a谋国,ab條件的查詢都可以使用槽地;如需b查詢則需要考慮a索引和b索引的長度也就是使用空間 - 覆蓋索引
如果查詢條件使用的是普通索引(或是聯(lián)合索引的最左原則字段),查詢結果是聯(lián)合索引的字段或是主鍵芦瘾,不用回表操作捌蚊,直接返回結果,減少IO磁盤讀寫讀取正行數據近弟。如建立身份證號和姓名的聯(lián)合索引缅糟,則根據身份證號查詢姓名時不需要回表查詢 - 索引下推
市民表為例(name,age)聯(lián)合索引;
select * from user where name like "a%" and age = 10;
MySQL5.6版本之前祷愉,會對匹配的數據進行回表查詢窗宦;
5.6版本后,根據聯(lián)合索引(覆蓋索引)可以獲取到age二鳄,直接過濾掉age!=10的記錄赴涵,再進行回表查詢,減少回表率订讼,提升檢索速度