一文讀懂mysql索引底層原理

2021-09-12 21:51:19 字數 1669 閱讀 9567

mysql官方對索引的定義為:索引是幫助mysql高效獲取資料的資料結構,簡單來說:索引就是資料結構.

資料庫的底層索引是用b樹和b+樹實現的,但是為什麼使用的是它們,為什麼不用紅黑樹?

紅黑樹等資料結構也可以用來實現索引,但是檔案系統以及資料庫系統普遍採用b-tree/b+tree作為索引結構.這是因為:索引本身也很大,因此索引往往是以索引檔案的形式儲存在磁碟上.所以,索引查詢的過程就會產生磁碟的i/o操作,相比於記憶體訪問,i/o訪問消耗要高幾個數量級,所以索引的優劣最重要的指標就是在查詢過程中的磁碟i/o訪問次數.

b-/+的效能分析:

一般使用磁碟i/o次數評價索引結構的優劣.

b樹將乙個節點的大小設為乙個頁,每次新建節點時,直接申請乙個頁的空間,這樣就保證乙個節點物理上也儲存在乙個頁裡,計算機儲存分配是按頁對齊的,就實現了乙個node只需要磁碟訪問一次,我們可以獲得最大數量的資料.所以,b樹的深度決定了要訪問磁碟i/o的次數.

而紅黑樹這種結構,h要大的多.由於邏輯上很近的節點物理上可能很遠,無法利用其區域性性.

為什麼b+樹更適合外存索引?

因為b+樹的內節點去掉了data域,因此有更大的出度,而且它是根據索引關鍵字進行查詢,不經過分支結點,而是沿著下一葉子的指標就可遍歷所有的關鍵字.

mysql簡介:

mysql是目前非常流行的開源關係型的資料庫,不僅是免費得,可靠性高,速度也比較快,而且擁有靈活的外掛程式式儲存引擎.

每個外掛程式式的儲存引擎都有各自的特點,能夠根據具體的應用建立不同的儲存引擎表.每一種儲存引擎都使用不同的儲存機制,索引技巧,鎖定水平並且最終提供廣泛的不同的功能和能力.

注意:儲存引擎是基於表的,而不是基於資料庫的.

mysql索引:

myisam儲存引擎不支援事務,表鎖設計,支援全文索引.它的另乙個與眾不同的地方是它的緩衝池只緩衝索引檔案,而不緩衝資料檔案,資料檔案的緩衝交由作業系統本身來完成.

它的索引結構採用b+樹作為索引結構,葉子節點的data域存放的是資料記錄的位址.所以其資料檔案和索引檔案是分離的.

搜尋過程:

按照b+搜尋演算法搜尋演算法搜尋索引,如果指定的key存在,取出data的值,然後以data的值作為位址,讀取相應的資料記錄.

這種索引方式也叫做"非聚集索引".

innodb索引:

innodb索引方式與myisam的區別:

innodb的資料檔案本身就是索引檔案.myisam資料檔案和索引檔案分離,但innodb的表資料檔案本身就是按b+樹的組織形成的索引結構,這顆樹的葉節點data域儲存了完整的資料記錄.這個索引的key就是資料表的主鍵,因此innodb表資料檔案本身就是主索引.

其葉子節點包含了完整的資料記錄,這種索引叫做"聚集索引".

一文讀懂Nginx

問 nginx的負載均衡演算法有什麼?預設是什麼演算法?答 1 輪詢 按請求的時間輪詢查空閒的後端伺服器 2 指定輪詢機率 機率的原因是後端伺服器的效能不均勻,好的多分點,差的少分點 3 固定ip繫結固定伺服器 預設是加權輪詢,就是優先訪問權重高的伺服器 問 nginx是單執行緒的嗎?答 是單執行緒...

一文讀懂SpringMVC

主要講的是dispatcherservlet這個類 ioc其實是乙個map,工程啟動後掃瞄路徑,根據類的全限定名建立bean 問 怎麼根據路徑找到方法?map還存key為 aaa value為該controller例項 問 autowired原理?自定義註解,在載入的時候,掃瞄controller層...

堆疊 一文讀懂

堆疊 stack 是一種先進後出的 操作受限的線性表,也可以直接稱為棧。可以把棧想象成乙個桶一樣,往這個桶裡面一層一層的放東西,先放進去的在裡面,後放進去的東西依次在外面。但取東西的時候就是先取靠近外面的,再依次一層層取裡面的。這就是 後進先出 last in first out 的原則。因此 棧 ...