MySql索引剖析

2021-10-07 07:04:11 字數 2789 閱讀 7277

1.最近朋友問我乙個問題,一時把我給問懵了。mysql 索引的本質是什麼?

2.資料庫索引的本質:分散儲存的資料結構

首先最簡單的二叉搜尋樹如下:

它通過二分查詢的方式大大減少需要檢索的資料體量,從而加速查詢速度。

當然有特殊情況:

當出現這種二叉樹(例如通過自增id建立的索引),就會導致建立索引沒有提公升查詢速度效果。

這個時候就用到平衡二叉搜尋樹來解決這個問題:

上圖就是乙個平衡二叉樹,下面來簡述以下它的查詢過程:

eg: 需要查詢 關鍵字 8

(1).首先將二叉樹最頂端關鍵字10存入快取與8進行對比,發現8比10小。

(2).然後就會通過p1 傳導到 關鍵字5,將關鍵字5存入快取再與8進行對比,發現8比5大。

(3).然後就會通過p2 傳導到 8關鍵字,與8進行匹對。匹對成功,將通過資料區的位址找到資料,最終返回。

但是這樣會有很明顯的缺陷,如果資料量很多,就會導致樹過深,每次查詢匹對都會進行io操作,導致很浪費效能。

不僅如此,這種查詢方式,每次進行io操作的時候,都只進行乙個關鍵字的快取,造成記憶體浪費。(沒有利用好作業系統跟磁碟的互動特性)。

此時就要利用 多路平衡樹(b-樹)來優化這個問題。

查詢過程:

將查詢分為5個區間:

(1). 無窮小 — 17

(2). 17

(3). 17------35

(4). 35

(5). 35 ---- 無窮大

其餘查詢機制同平衡二叉樹。

下面做乙個分析:

假設 一次io互動可以儲存 4kb的資料,而1個整型數 占用空間為 4b,再見上資料內容占用空間 假設也為 4b.那麼每一次io互動就能進行:

4kb = 4096 b

4096 / 8 = 500 +

500 + 關鍵字的匹對。這樣很大程度的優化了這個查詢效能。

思考:為什麼不要在常變的列上建立索引?

因為為了維護二叉樹的絕對平衡,會對節點進行不斷的合併**旋轉修改資料結構,導致效能損耗更大。

而mysql 中使用的是 b-樹的加強版 : b+樹(加強版多路平衡二叉樹)。

查詢匹對規則:採用左閉合區間

上圖分為以下幾個匹對區間

(1). 1<= x < 28

(2). 28<= x < 66

(3). 68<= x

mysql定製的b+樹中,根節點和支節點沒有資料區,葉子節點才有資料區,這種好處就是:

(1).每次io操作可以進行更多的資料匹對(釋放了資料區的空間用於關鍵字快取)。

(2).基於索引結構庫,掃庫掃表能力強於b-樹

(3).b+樹最底層的資料是首尾相連的雙向鍊錶,範圍查詢,由於資料天然有序,所以強於b-樹。

(4).由於b+樹的結構,導致b+樹每次查詢io次數都是固定的,而b-樹每次查詢進行io操作次數是不固定的,所以相對b-樹 b+樹 效能更加穩定。

這就是mysql 中使用的索引資料結構。 b+樹(b+tree)

*擴充套件:mysql 2大主流引擎實現 b+tree

每次建立一張表都會生成以下幾個檔案(5.7版本以前)

(1)…frm 檔案— 表骨架 (5.7以前才有,8.0移除)

(2)…innodb 檔案為 innodb 引擎 儲存檔案

(3). .myisam.myd檔案 為 myisam 引擎 儲存資料檔案

(3). .myisam.myi 檔案為 myisam 引擎 儲存索引檔案

myisam:如下

當多索引時:

兩個索引沒有主次之分,搜尋次級都是同等級。

innodb:

只有1個檔案,索引和資料都儲存在 這個檔案(innodb.ibd)

什麼是聚集索引?

innodb中多索引:

思考:為什麼輔助索引最底層不直接儲存資料的位址,而儲存的是主鍵索引,再回表進行查詢?

正是因為 完全平衡二叉樹的特性,當資料量發生變化時,為了保持平衡,會對節點進行合併**旋轉,所以會導致,位址變更,所以不能直接儲存位址。

但是這樣的話,每次都需要回表查詢,非常麻煩,所以mysql 底層進行了優化, 叫做 自適應hash索引。

簡單理解為 索引的索引,非常的巧妙。

mysql索引剖析

講索引之前讓我們先看看一些常見的資料結構 1.hash 概念 是把任意長度的輸入 又叫做預對映pre image 通過雜湊演算法變換成固定長度的輸出,該輸出就是雜湊值 時間複雜度和空間複雜度 o 1 缺點 hash索引不支援範圍查詢,不支援排序 優點 時間複雜度低 比如現在hash表中有7條資料,要...

MySQL 索引 語法及案例剖析

mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。拿漢語字典的目錄頁 索引 打比方,我們可以按拼音 筆畫 偏旁部首等排序的目錄 索引 快...

搜尋引擎剖析

選自 網路營銷實訓 我們如何才能成為搜尋引擎遊戲中的常勝將軍?在研究這個問題之前,我們先來了解一些基本知識,比如什麼是搜尋引擎 搜尋引擎是怎樣工作的 有哪些主要的搜尋引擎等。那麼,如何檢視 的元標籤呢?很簡單,你只需檢視 的源 即可。以ie 瀏覽器為例,在瀏覽器頂部的導航欄中點選 檢視 然後在其下拉...