Mysql資料庫是目前一款非常火爆的關係型資料庫。
當我們談到關係型資料庫的時候,總會談到索引(index),在面試中也是個高頻問題。
可能我們在剛剛接觸資料庫的時候,對於索引我們總會聽說索引的優點是加快查詢的速度,利用索引可以確定表中數據的唯一性,使用group by、order by等分組、排序的時候,group by、order by後面所根據的欄位最好是被索引包含的欄位,因為被索引包含的欄位是已經排好序的了,可以減少操作時間。同時也會聽說不能創建太多的索引,因為在對錶的數據進行insert、update、delete操作的時候,也需要動態的維護索引。總之我們聽說索引的很多優點和缺點在此就不在累述。
那麼我們是否考慮過這些優缺點的依據是什麼?為什麼索引會有這些優缺點?
其實很簡單,依據主要是數據結構中的B+tree。
那麼資料庫中的索引和B+tree又有什麼關係???別著急,且聽我慢慢道來。
首先我們創建一個數據table
CREATE TABLE `student`.`Untitled` (
`studentId` varchar(4) NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`age` int(255) NOT NULL,
PRIMARY KEY (`studentId`) USING BTREE,
INDEX `studentIndex`(`studentId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
創建了一個student表,裡面有三個欄位學生Id、名字、年齡,其中學生Id欄位添加索引,引擎類型為InnoDB。

圖1
現在我們添加上了索引,此時會根據索引來構建一個B+tree結構。類似下圖結構:

圖2 B+樹
當然我這裡這是畫了一個類似圖,其實在數據量足夠大的時候,樹的根節點裡面可以存儲很多的數據,這就解決了樹高度的問題(此知識點後面章節會詳解),如果數據的高度小了,檢索數據的次數就會相應減少。

圖三 數據表和索引B+樹的對應圖
我們通過圖三就可以明白我上面所列舉的索引的優缺點了。
1.當我們通過索引來查詢數據的時候,例如查詢studengId為6的數據,我們通過檢索B+樹只需要3次就能找到數據,而且樹的根節點還是在內存中,檢索速度很快的,但是如果不走索引,需要逐條檢索信息,需要檢索6次才能找到數據,因為這些數據都是存儲在磁碟上的,每次檢索都是一個IO,如果數據量大了,檢索數據是很浪費性能的。
2.我們看圖三中索引列在B+樹中都是排好序的,右面葉子節點的值總是比左邊葉子節點的值大(B+樹的性質)。這也就解釋了上面優點中排好序了。
3.當我們每次修改、刪除、更新數據的時候,都會重新維護索引,其實主要就是重新構建這個B+樹。
4.創建多個索引,就會生成多個B+樹,每個都是需要存儲的,所以不建議創建太多的索引。
所以我們平時看到的索引優缺點都是主要圍繞著這個B+樹結構來解釋的。
後續關於索引的深度內容將繼續更新,只有懂得了索引,才可能對sql進行高效的優化。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/280020.html
微信掃一掃
支付寶掃一掃