【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
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...