深入理解Mysql索引底層資料結構與演算法

2022-07-25 03:30:12 字數 2013 閱讀 7671

1.索引的定義

mysql官方對索引的定義為:索引(index)是幫助mysql高效獲取資料的資料結構
大家使用索引有沒有想過這個問題?為什麼索引能夠幫助mysql高效獲取資料?我一一給大家道來!在給大家講之前,先更大家分享一些計算機基礎知識,有助於理解總結:通過上面的一些知識,我們知道當磁頭移動到另乙個磁軌讀取詩句就是我們常說的一次i/o操作,但是我們知道mysql資料是分布到不同的磁軌上的,每次讀取資料都要把所有磁軌讀取一遍,那我們進行i/o次數就很多了,查詢效率就很低

那索引就是把索引字段資料的位址儲存起來,來幫助mysql直接定位到哪個磁軌的哪個扇區,這樣就減少i/o操作了,自然查詢效率就提高了

2.資料結構那麼多,mysql索引為什麼要用b+tree資料結構,而不是其他呢?肯定其他的資料不滿足我們的要求

常見的資料結構

1.二叉樹

2.紅黑樹

3.hash

4.b tree

5.b+tree

a.二叉樹

二叉樹是n(n>=0)個結點的有限集合,該集合或者為空集(稱為空二叉樹),或者由乙個根結點和兩棵互不相交的、分別稱為根結點的左子樹和右子樹組成。

不使用原因:會出現極端情況,乙個節點只有一度,就是只有乙個子節點,那讀取樹的一層就是一次i/o,那效能也不好
b.紅黑樹

紅黑樹即為平衡二叉樹的一種

不使用原因:極端情況下,乙個節點有2個子節點,那就出現一層只有2個節點的情況,這種效能也不好
c.hash

不使用原因:hash是把索引資料進行hash演算法對應乙個位址,我們會發現這個好像效能很好啊,直接找到,但是我們想想,它能滿足我們日常開發大部分情況嗎?比如通過大於或者小於去篩選資料,所以說也不合適,當然mysql還是提供了hash索引,畢竟有些場合還是用起來也不錯
d.b tree

1.度(degree)-節點的資料儲存個數2.葉節點具有相同的深度3.葉節點的指標為空4.節點中的資料key從左到右遞增排列

不使用原因:雖然解決了每一層的節點數的極端情況下,但是我們會發現每個節點儲存了索引和資料,那一層能儲存的資料太多也不好,畢竟記憶體能讀取的資料大小就是10kb
e.b+tree

1.b+tree(b-tree變種)2.非葉子節點不儲存data,只儲存key,可以增大度3.葉子節點不儲存指標4.順序訪問指標,提高區間訪問的效能

使用原因:設計有幾個方面

1.非葉子節點不儲存data,只儲存key,可以增大度

2.葉子節點不儲存指標

3.順序訪問指標,提高區間訪問的效能

3.b+tree索引的效能分析

4.不同的儲存引擎有不同的索引實現

1.myisam索引實現(非聚集)2.innodb索引實現(聚集)

a.myisam索引實現(非聚集)

--->myisam索引檔案和資料檔案是分離的

b.innodb索引實現(聚集)

1.資料檔案本身就是索引檔案2.表資料檔案本身就是按b+tree組織的乙個索引結構檔案3.聚集索引-葉節點包含了完整的資料記錄4.為什麼innodb表必須有主鍵,並且推薦使用整型的自增主鍵?5.為什麼非主鍵索引結構葉子節點儲存的是主鍵值?(一致性和節省儲存空間)

5.聯合索引結構

---->聯合索引的底層儲存結構長什麼樣?

6.索引最左字首原理

深入理解Mysql索引底層資料結構與演算法

我仔細地想了想,歸納為如下幾點 任何行業的任何人都必須勤奮努力,在機會來臨之前,克服自己的懶惰,每天寫一點技術文章,長期積累,達到屬於自己的10000小時 溫故而知新,可以為師矣,做筆記主要為了以後回頭看,鞏固知識點 可以隨時看當時的筆記是否有缺漏或者錯誤,可以及時補缺補漏,進行更正或補充 主要我以...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...

mysql 索引 層數 mysql 索引底層

hash索引o 1 b 樹索引 o logn 為什麼紅黑樹出現了,因為防止某些情況下二叉排序樹退化為鍊錶 誕生了二叉排序平衡樹 樹的效能取決於樹的高度 為什麼db要用m路b樹,為了再降低樹的高度,減少db 磁碟io 次數,如果在記憶體中,紅黑樹效率更高 為什麼m不能無限大,因為會退化成有序陣列,無法...