【Mysql技術內幕InnoDB存儲引擎】讀書筆記

来源:https://www.cnblogs.com/wangzhongqiu/archive/2019/09/11/11447267.html
-Advertisement-
Play Games

一、存儲引擎 1、InnoDB引擎 設計目標是面向線上事務(OLTP)處理的應用。 支持事務、行級鎖、通過多版本併發控制(MVCC)支持高併發、提供一致性非鎖定讀、next-key locking避免幻讀、主鍵聚集索引 2、MyISAM引擎 設計目標是面向OLAP應用。 不支持事務、不支持行鎖、表鎖 ...


一、存儲引擎

1、InnoDB引擎

設計目標是面向線上事務(OLTP)處理的應用。

支持事務、行級鎖、通過多版本併發控制(MVCC)支持高併發、提供一致性非鎖定讀、next-key locking避免幻讀、主鍵聚集索引

2、MyISAM引擎

設計目標是面向OLAP應用。

不支持事務、不支持行鎖、表鎖設計、支持全文索引

3、其他存儲引擎

二、InnoDB體繫結構

1、線程模型

InnoDB存儲引擎是多線程模型,後臺有多個不同的線程,用於處理不同的任務。

  • Master Thread:核心線程,將緩衝池中的數據非同步刷新到磁碟
  • IO Thread:負責io請求的回調處理
  • Purge Thread:負責undo頁的回收
  • Page Cleaner Thread:負責臟頁的刷新

1.1、Master Thread

內部由多個迴圈組成。包括主迴圈(loop),後臺迴圈(background loop)

主迴圈每隔一秒的操作

  • 把日誌緩衝刷新到磁碟,即使這個事務還沒有提交。很好的解釋了再大的事務提交時間也很短
  • 合併插入緩衝
  • 至多刷新n(可配置,自動調整,1.2版本之後)個臟頁到磁碟
  • 沒有用戶活動,切換到background loop

主迴圈每隔10秒的操作

  • 合併最多5個插入緩衝
  • 緩衝日誌刷新到磁碟
  • 刪除無用的undo頁
  • 刷新臟頁到磁碟(超過70%,刷新100頁,沒超過70%,刷新10頁)

2、記憶體模型

2.1、緩衝池

InnoDB是基於磁碟的存儲系統,為了彌補cpu和磁碟性能的差距,將從磁碟讀出的數據保存在記憶體中,下次讀取先從緩衝池中讀取。有數據更新也先更新緩衝池的數據,通過checkpoint機制寫回磁碟。緩衝池中包括索引頁、數據頁、undo頁、插入緩存、鎖信息等

2.2、緩衝池管理(LRU List)

最近做少使用演算法,最頻繁使用的頁在List前端,最少使用的頁在List末尾。當緩衝池容量不足容納新數據時,先從尾部釋放數據頁。新數據插入在List的midpoint(List的5/8,對朴素LRU的優化,朴素LRU插入List頭部。避免大量一次性查詢把頻繁使用的頁刷出緩衝池)

2.3、臟頁管理(Flush List)

當數據被更新,緩衝池中的數據首先被更新,修改之後的頁稱為臟頁。臟頁會保存到Flush List中,通過checkpoint機制把臟頁數據寫回磁碟

2.4、重做日誌(redo log)緩衝

首先把重做日誌信息存入緩衝區,然後按照一定頻率同步到重做日誌文件中。以下三種情況都會觸發重做日誌緩存同步到重做日誌文件:

  • Master Thread 每隔一秒刷新
  • 每個事務提交時
  • 重做日誌緩衝池容量達到閾值,一般是1/2

2.5、check point技術

為了防止宕機導致事務未提交信息丟失,在事務提交時,先把數據保存到重做日誌(redo log)中,再修改頁。保證了持久性(D)

發生宕機,重啟之後自動從重做日誌中恢複數據。

但是這裡有以下問題:

  • 重做日誌過大,宕機重啟恢複數據太慢
  • 重做日誌不能無限擴容,需要迴圈利用
  • 重做日誌不可用怎麼辦

check point就是為瞭解決這些問題:

  • 縮短資料庫恢復時間
  • 重做日誌不可用,刷新臟頁
  • 緩衝池不夠用,將臟頁刷新到磁碟

check point觸發時機:

  • Master Thread check point。每隔一秒觸發一次
  • LRU List check point。保證LRU List中有100個空閑頁,如果清理的頁中有臟頁,觸發check point 強制刷新臟頁數據到磁碟
  • Dirty Page too mush check point。臟頁太多,超過閾值,觸發check point 強制刷新臟頁數據到磁碟

3、關鍵特性

3.1、插入緩存

(1)為什麼需要插入緩存?

我們知道索引分為聚集索引和非聚集索引。

聚集索引一般是自增的唯一id,頁中的數據記錄按順序存放,寫入的時候不需要隨機讀取其他頁中的數據,寫入速度很快(如果用UUID作為主鍵,寫入速度會很慢,每次寫入都需要隨機讀)

實際應用中,一張表往往還有非聚集索引的存在。非聚集索引葉子節點的插入不是順序的,需要離散的訪問非聚集索引頁,隨機讀取導致了插入數據的性能下降。插入緩存就是為了優化這種場景下的插入速度

(2)什麼場景會觸發插入緩存?

  • 索引是輔助索引
  • 索引不是唯一索引

對於非聚集索引的插入,會先判斷非聚集索引頁是否在緩衝池中,如果在緩衝池中,直接插入索引頁,如果沒在,先放入到insert buffer對象中,然後再以一定的頻率把insert buffer中的數據和非聚集索引的葉子節點進行數據合併

(3)實現原理

insert buffer 的數據結構也是B+樹,有記錄要插入的時候,會對記錄進行封裝,按照記錄的插入順序進行編號,是順序寫入

3.2、兩次寫

(1)為什麼需要插入兩次寫?

如果InnoDB正在寫入某個頁的數據到磁碟,正好寫了一部分的時候宕機了。這種情況稱為部分寫失效,會導致數據丟失

(2)實現原理

double write由兩部分組成。一部分是double write緩衝,一部分是物理磁碟連續共用空間。在刷新臟頁數據的時候,先複製一份臟頁數據到兩次寫緩存中,在順序寫入共用磁碟中(因為是順序寫性能影響不大)。最後寫入數據存儲磁碟中(離散寫)

3.3、自適應hash索引優化

hash是非常快的查詢方式,時間負責度為O(1)。而B+樹的查找次數取決於樹的高度。

如果一個頁被頻繁的訪問,而且訪問模式也相同(聯合索引使用最左原則)。會自動針對這頁數據根據緩衝池中的索引建立Hash索引提高查詢速度

3.4、非同步IO

可以在發出一個IO請求後,在發出另外的IO請求,沒必要等待上一次的IO請求處理完成。把全部IO請求都發出,等待所有IO操作的完成,這就是AIO(Aysnc IO)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 先列出java併發涉及的知識點,後面再慢慢補. java併發 1 常見概念 進程:程式執行的實體,操作系統資源調度資源分配的基本單元 線程:程式執行的最小單元,擁有獨立的堆棧和局部變數等屬性,可以共用進程的資源 同步是串列執行,阻塞 非同步是並行執行,非阻塞 併發:多個任務交替執行 並行:多個任 ...
  • 學習Python的第一天,也是我第一次寫博客的一天,不怎麼會寫博客,也不怎麼會Python,也不怎麼會寫總結.在學Python的第一天發現自己腦子不是很好用,在學習過程中出現很多錯誤,錯誤錦集如下,哈哈哈哈,要加油.以後要註意不要再犯下麵的錯誤了,不然以後在工作中很難獨立完成,也容易出現很多錯誤,這 ...
  • 之前多篇文章從mysql的底層結構分析、sql語句的分析器以及sql從優化底層分析, 還有工作中常用的sql優化小知識點。面試各大互聯網公司必問的mysql鎖和事務隔離級別,這篇文章給你打神助攻,一飛衝天。 鎖定義 鎖是電腦協調多個進程或線程併發訪問某一資源的機制。 在資料庫中,除了傳統的計算資源 ...
  • 一、instanceof運算符 instanceof是Java語言中的一個二元運算符,它的作用是判斷一個引用類型的變數所指向的對象是否是一個類(或介面、抽象類、父類)的實例,即它左邊的對象是否是它右邊的類的實例該運算符返回boolean類型的數據。 常見的用法為:result=object inst ...
  • [TOC] 原文鏈接: "QRowTable表格控制項(四) 效率優化之 優化數據源" 一、開心一刻 一程式員第一次上女朋友家她媽板著臉問 :你想娶我女兒,有多少存款? 程式員低了下頭:五百! 她媽更鄙視了:才五百塊,買個廁所都不夠! 程式員忙說:不是人民幣! 她媽:就算是美元,還是不夠買廁所! 程式 ...
  • Java中時間API使用詳解 [TOC] 1. 時區概念 國際經度會議(又稱國際子午線會議)上,規定將全球劃分為24個時區(東、西各12個時區)。規定英國的格林尼治天文臺舊址為中時區(零時區)、東1 12區,西1 12區。每個時區橫跨經度15度,時間正好是1小時。最後的東、西第12區各跨經度7.5度 ...
  • 電腦基礎方面的知識,對於一些非科班出身的同學來講,一直是他們心中的痛,而對於科班出身的同學,很多同學在工作之後,也意識到自身所學知識的不足與欠缺,想回頭補補基礎知識。關於電腦基礎的課程很多,內容繁雜,但無論是相關書籍還是大學課程,都有點脫離工作。特別地,電腦基礎知識體系龐雜,想要從零學習或者復 ...
  • 剛剛開始寫微服務,這篇博客就紀念我第一個微服務吧。 1.新建工程 首先要搭建一個微服務環境,我用的是開發環境IDEA,詳細步驟如下: ①打開IDEA File->New->Project 選擇Spring lnitializr 然後點擊next。 填寫包名和項目名字,自己隨便寫,然後next。 進入 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...