Mysql索引的實現原理,B+Tree,WAL

InnoDB 引擎,每一個數據表有兩個文件 .frm.ibd,分別為表結構,數據和索引,數據掛在主索引的葉子節點上,此主索引稱為聚簇索引。

MyISAM 引擎,每一個數據表有三個文件.frm.MYI.MYD,分別為表結構,索引,數據;也就是說其索引和數據是分開的,索引的葉子節點存儲的不是數據而是磁盤地址,稱為非聚簇索引。

下面只分析 InnoDB 引擎。

一、為什么是 B+Tree 而不是 B-Tree

B-Tree

img

B+Tree

img

他兩最大的區別就是 B+Tree 將data部分下沉到了最后一級,即葉子節點。

對于基于磁盤的存儲,一般使用對磁盤的IO次數來評判索引結構的優劣,假設操作系統對磁盤的每次IO能讀取 4K 數據(塊),假設索引結構的每一個節點有16K的固定空間,這個16K稱為頁,索引以頁作為最基本的管理單位,所以每一次讀取要4次IO,從節省IO次數的角度講,如果每個節點上如果能存儲更多的key就能減少IO的次數,而B+Tree是將所有的data下放到葉子節點,其他節點全部用來存儲key和指針,顯然IO效率更高。

一般在數據庫系統或文件系統中使用的B+Tree結構都在經典B+Tree的基礎上進行了優化,增加了順序訪問指針。在B+Tree的每個葉子節點增加一個指向相鄰葉子節點的指針,做這個優化的目的是為了提高區間訪問的性能。也就是說,通過這個指針你可以訪問到已經排序好的key的列表。

二、InnoDB 引擎讀寫磁盤的過程

我們經常聽人說Mysql對磁盤的寫操作是隨機尋址的,所以需要WAL組件。但是為什么Mysql對磁盤的寫操作是隨機尋址的呢?這就需要了解它讀寫磁盤的過程。

就以InnoDB引擎為例,其索引結構和源數據都存在.ibd文件里,文件是一塊大的連續的磁盤空間,收到查詢請求后引擎就去讀取此文件的主索引,以頁(16K)為單位讀取,從B+Tree的根節點開始,當然有時候一個節點不止一頁,如果沒有找到這個key就要接著讀,直到找到了data。

從根節點指向一級節點的時候,那么一級節點存在文件中的哪個位置呢,或者說即便你知道了它在文件中的位置,你要怎么讀到它呢,我們可以使用相對于文件起始位置的偏移量來讀取那一塊的數據,或者計算出其在磁盤上的地址,然后直接讀取磁盤,所以指向子節點使用的是指針,整個的讀取過程是跳躍的隨機的。

同樣的,在寫入的時候,要寫入的目標磁盤塊的位置也是跳躍的,所以說寫操作是隨機的尋址,它不是append模式。有時候在寫入后現有節點還要調整。

說到底這些節點都還是存在于文件中,文件是一塊大的連續的磁盤空間,所以這里的指針應該是相對于文件起始地址的相對地址,而不能是磁盤的絕對地址,否則你一移動文件那豈不都失效了。

在機械硬盤上面,這種隨機尋址會嚴重影響磁盤的IO性能。

三、需要 WAL (Write-Ahead Logging)

既然直接落盤性能堪憂,那就改成異步落盤。基本上所有的數據庫都使用WAL模式來解決這個問題,實現方式可能各有不同,但大致思路都是一樣的。

一個修寫入請求,先寫入日志文件,成功之后才寫入緩存,然后有后臺程序將日志文件的內容落盤。

在寫日志文件的時候,使用 append模式,這就是順序寫,要比隨機寫好很多。

redo log:保證數據一致性。如果Mysql宕機了,重啟的時候可以將日志文件中未落盤的數據落盤。

undo log:保證事務的原子性,實現多版本并發控制(MVCC)。它相當于在修改之前做一下備份。

組提交機制:將多個小的事務合并成一組再執行落盤,可以大幅度降低磁盤的 IOPS 消耗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35566.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35566.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35566.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

戀愛腦?No,愛情保鏢還得靠AI!

本文由 ChatMoney團隊出品 你是否曾經想過,為什么我們會在戀愛中變得如此“上頭”,仿佛整個世界都圍繞著那個TA旋轉? 戀愛腦,通常是指一個人在戀愛中過度投入、過度依賴對方,甚至無法自拔的心理狀態。 你會發現自己時時刻刻都在…

TemporalAccessorUtil

通常與Java中的日期和時間處理有關,特別是與java.time包的TemporalAccessor接口相關,TemporalAccessor是與Java 8引入的日期時間API的一部分,用于表示一個不可變的日期時間對象,例如LocalDate,LocalTime,LocalDateTime等; TemporalAccessorUtil可能是一個自定義的工具類&#…

Linux網絡-網絡層IP協議、數據鏈路層以太網協議、ARP協議、ICMP協議和NAT技術

文章目錄 前言一、IP協議IP報頭解析4位版本4位首部長度16位總長度8位生存時間8位協議16位首部校驗和32位源IP地址和32位目標IP地址 網段劃分子網-局域網子網掩碼特殊的IP地址 公網IP地址與私網IP地址運營商路由路由表 數據鏈路層MAC幀格式局域網通信原理局域網數據碰撞 MTU分片…

Docker-compose 實現Prometheus+Grafana監控MySQL及Linux主機

. ├── Grafana │ ├── data │ └── docker-compose.yaml ├── Mysql │ ├── conf │ ├── data │ ├── docker-compose.yaml │ └── logs ├── Mysqld_exporter │ ├── conf │ └── docker-compose.yaml ├── node-exporter │…

HarmonyOS應用開發學習經驗

一、HarmonyOS學習官網 開發者能力認證 HarmonyOS應用開發者基礎認證6月之前的學習資源官網已經關閉過期,大家不要慌,官方更新了最新資源,但是,對于之前沒有學習完的學員不友好,存在知識斷片的現象,建議官…

如何理解:業務架構、應用架構、數據架構、技術架構與系統和復雜度

關于系統的理解 1.1 系統的概述 隨著人類社會的發展,人們面對越來越多的規模巨大、關系復雜、參數眾多地復雜問題,這些問題的復雜度已經遠遠超出人類的理解能力,系統論就是為了分析和解決這些問題而生。我們平時接觸的計算機系統包括軟件系統…

ChatGPT的Mac客戶端正式發布了!Mac用戶有福了

ChatGPT的Mac客戶端正式發布了!Mac用戶有福了 🎉 大家好,我是貓頭虎,科技自媒體博主。今天我帶來了一個超級重磅的消息 📢,就是 ChatGPT 的客戶端終于來了!這對我們所有 Mac 用戶,尤…

2024全國大學生信息安全競賽(ciscn)半決賽(華中賽區)Pwn題解

簡介 前段時間賽前準備把ciscn東北賽區、華南賽區、西南賽區半決賽的題都復現完了。 可惜遇到了華東北賽區的離譜平臺和離譜pwn出題人: 假的awdp(直接傳🐎到靶機,然后連上去cat /flag.txt即可)題型分布不合理&#…

當前的網安行業絕對不是高薪行業

昨天,面試了一個剛畢業兩年的同學小A。第一學歷為某大專,第二學歷為某省地區的本科院校。面試過程表現一般偏下,但動不動就要薪資15K 這個人,我當場就PASS了。主要原因是,并非是否定小A同學的能力,而是他…

VSCode運行前端項目-頁面404

背景: 通過VSCode運行前端本地項目,運行成功后打開本地鏈接:http://1x.xxx.x.xxx:9803/ ,發現打開的頁面重定向到404:http//1xx.xxx.x.xxx:9803/404; 并且控制臺出現:Failed to load resource: …

詳解 ClickHouse 的監控及備份

一、ClickHouse 監控概述 ClickHouse 運行時會將一些個自身的運行狀態記錄到眾多系統表中(system.*)。所以對于 ClickHouse 自身的一些運行指標的監控數據,也主要來自這些系統表。直接查詢這些系統表進行監控會有一些不足之處: 這…

win10修改遠程桌面端口,Windows 10下修改遠程桌面端口及服務器關閉445端口的操作指南

Windows 10下修改遠程桌面端口及服務器關閉445端口的操作指南 一、修改Windows 10遠程桌面端口 在Windows 10系統中,遠程桌面連接默認使用3389端口。為了安全起見,建議修改此端口以減少潛在的安全風險。以下是修改遠程桌面端口的步驟: 1. 打…

IMX6ULL SD卡啟動uboot+kernel+rootfs

目錄 1. 背景說明 2.SD卡啟動 2.1準備條件 2.2 對SD卡分區格式化 2.3 制作sd卡鏡像 3.效果測試 1. 背景說明 網絡上絕大數教程,教大家把uboot燒錄到SD卡,然后uboot啟動后,通過TFTP下載kernel和設備樹,然后通過nfs掛載文件系…

油猴腳本入門

如何支持jquery 首先要在頭部引入外部資源 require https://cdn.bootcss.com/jquery/2.2.1/jquery.js編輯開始前添加一個注釋 /* globals $ */完整代碼 // UserScript // name study_jquery // namespace http://tampermonkey.net/ // version 1.0 // …

ultralytics官方更新 | 添加YOLOv10到ultralytics

💡💡💡本專欄所有程序均經過測試,可成功執行💡💡💡 專欄目錄:《YOLOv8改進有效漲點》專欄介紹 & 專欄目錄 | 目前已有40篇內容,內含各種Head檢測頭、損失函數Loss、…

【C++】類和對象(六)

文章目錄 二、static成員概念面試題一個題目 三、友元友元函數說明 友元類 四、內部類(了解)概念:注意:特性: 五、匿名對象 書接上回: 【C】類和對象(五)隱式類型轉換 二、static成員 01_31 03 12 01 概…

Xcode 手動添加模擬器

在Xcode中下載iOS模擬器很慢,且經常出現下載失敗,需重新從頭開始下載的問題。現了解Xcode 15 和運行環境是分離的,故闡述一下手動添加模擬器的步驟: 官網下載所需模擬器:https://developer.apple.com/download/all/?…

idea項目推送gitee/github

選擇需要的項目創建本地Git倉庫 添加到暫存區 第一次提交 或者點擊這里 寫備注并commit 推送遠程倉庫 填寫地址 解決上圖警告 右鍵打開項目,輸入 git pull origin master –allow-unrelated-historiesgit push -u origin master -f推送成功 idea項目推送github及克…

怎么用韓語說幫忙更合體,柯橋零基礎韓語培訓

1. **詳細解釋:** - **標準寫法與音譯:** - **??**(讀作 dop-da):動詞“幫助”。 - **????**(讀作 do-wa-ju-da):動詞“幫忙”,字面意思是“給予幫助”。 - **??…

PMP證書在國內已經泛濫了,大家怎么看?

目前,越來越多的人獲得了PMP證書。自1999年PMP引入中國以來,全國累計PMP考試人數接近60萬人次,通過PMP認證的人數約為42萬人。雖然這個數據看起來很大,但絕對不能說是過多。 首先,PMP在中國并不普遍。根據美國項目管理…