說明關係型數據庫通過索引提升查詢效率的背後原理

如果沒有索引,數據庫引擎需要通過全表掃描來查找數據,這會產生大量的磁盤IO。

關係型數據庫使用B+樹構建索引來加速加快查詢。B+樹是一種二叉查找樹(每個節點的鍵值必須:比保存在左子樹的任何鍵值都要大,比保存在右子樹的任何鍵值都要小),這樣隨機查找某個鍵值時可以通過從根節點執行二叉查找來加速查詢,查詢成本取決於樹的層數。

針對範圍查詢和排序的優化:在每個葉子節點保存其下一個葉子節點的指針,這樣當指定範圍範圍查詢時,先從根節點根據範圍的左值找到其葉子節點,之後通過向後遍歷葉子節點即可找到對應範圍右值,這樣可以加速範圍查詢、排序、分組等數據庫查詢動作。

針對磁盤讀寫速度的優化:除了葉子節點之外的其他節點只保存鍵值,這樣對磁盤的單次讀寫可以獲取到儘可能多的數據。以MySQL爲例,一個1000萬行的表對應的B+樹按照主鍵查找理論上只需要3次磁盤IO,這相對於全表掃描帶來的磁盤IO是多個量級的性能提升。

MySQL等數據庫引擎在實際實現B+樹索引的時候,針對磁盤讀寫做了優化:非葉子節點中只存放key值,葉子節點中除了key值也會存放數據,按照存放數據的不同索引區分爲主索引(聚簇索引)和輔助索引:

a) 主索引的葉子節點中存放該key值對應的完整記錄,使用主索引進行查找時,可以直接輸出記錄;一個表只能創建一個主索引。

b) 普通索引的葉子節點則存放對應主鍵的值,因此在使用輔助索引進行查找時,需要先查找到主鍵值,然後再到主索引中進行查找;一個表可以創建多個輔助索引。

除了B+樹,關係型數據庫一般也支持哈希索引,哈希索引能夠非常高效地進行隨機查找,但是對於範圍查詢、排序和分組都不支持。
————————————————
版權聲明:本文爲CSDN博主「你就是神」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_37492314/article/details/105291529

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