欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL 學習總結(jié) 之 初步了解 InnoDB 存儲引擎的架構設計

 更新時間:2020年02月10日 09:49:08   作者:不送花的程序猿  
這篇文章主要介紹了MySQL 學習總結(jié) 之 初步了解 InnoDB 存儲引擎的架構設計,文中給大家提到了mysql存儲引擎有哪些,本文給大家介紹的非常詳細,需要的朋友可以參考下

一、存儲引擎

上節(jié)我們最后說到,SQL 的執(zhí)行計劃是執(zhí)行器組件調(diào)用存儲引擎的接口來完成的。
那我們可以理解為:MySQL 這個數(shù)據(jù)庫管理系統(tǒng)是依靠存儲引擎與存放數(shù)據(jù)的磁盤文件進行交互的。

那么 MySQL 有哪些存儲引擎呢?

主要有 MyISAM、InnoDB、Memory等等。而現(xiàn)在互聯(lián)網(wǎng)中,基本都是使用 InnoDB 存儲引擎,所以接下來我將簡單總結(jié)自己關于 InnoDB 存儲引擎的學習,比較簡單的介紹 InnoDB 存儲引擎里面的組件。

二、緩沖池

我們現(xiàn)在都知道了,數(shù)據(jù)庫的數(shù)據(jù)是存放在磁盤文件中的。
那么,我們每次對表的增刪改查都是直接在磁盤文件里面操作嗎?

答案:不是的!

因為磁盤文件的隨機讀寫的性能是非常差的,如果所有操作都在磁盤中進行,那么就不會有高性能 MySQL 的說法了,MySQL 也不能支持高并發(fā),也不會在互聯(lián)網(wǎng)中如此的流行。

這時候要引入 InnoDB 存儲引擎最重要的一個組件,就是緩沖池(Buffer Pool),它是一個非常重要的內(nèi)存結(jié)構。它是內(nèi)存里面的,憑借著內(nèi)存非常高性能的讀寫,使得 MySQL 能夠支持高并發(fā)。

緩沖池(Buffer Pool) 的使用原理:

我們先復習一下 MySQL 接收請求的過程。

①、MySQL 的工作線程專門監(jiān)聽數(shù)據(jù)庫連接池的連接,有連接就獲取連接中的 SQL 語句。
②、然后將 SQL 語句交給 SQL 接口 去處理,SQL 接口里會進行下面的一系列流程。
③、查詢解析器 將 SQL 語句解析成 MySQL 能理解的東西。
④、接著 查詢優(yōu)化器 去為 SQL 語句制定一套最優(yōu)的執(zhí)行計劃。
⑤、執(zhí)行器 會根據(jù)執(zhí)行計劃去調(diào)用存儲引擎的接口。

上面是上篇文章總結(jié)到的東西,那么存儲引擎的接口是怎么進行增刪改查的呢?以更新操作為例,其他的同理。
首先,存儲引擎會先判斷更新 SQL 對應的數(shù)據(jù)行是否在 緩沖池(Buffer Pool) 里面。如果在的話就直接在 緩沖池(Buffer Pool) 里更新數(shù)據(jù)然后返回;如果不在,則從磁盤文件里讀取數(shù)據(jù)到 緩沖池(Buffer Pool) 里,然后進行更新操作,最后再返回結(jié)果。

三、undo 日志文件

我們都知道,在事務中,事務提交前是可以隨時回滾對數(shù)據(jù)的更新的。那么是依靠什么來做的呢?

依靠的是 undo 日志文件。

undo 日志文件的使用原理:

更新數(shù)據(jù)為例:
假如你更新某行 id=100 的數(shù)據(jù),將字段 name 由原來的“張三”改為“李四”,那么此時會將 "id=10" 和 “name=張三” 這兩個關鍵信息寫入 undo 日志文件中。
當你事務提交前需要回滾,就會從 undo 日志文件 中找到這兩個關鍵字,然后進行更新操作的回滾。

四、redo log buffer

上面說到,所有的增刪改查操作其實是在緩沖池里面進行的,所以其實對數(shù)據(jù)的修改并沒有立刻落實到磁盤文件里面。

那么有一個問題:在緩沖池的臟數(shù)據(jù)刷回磁盤文件中前,MySQL 宕機了怎么辦?
此時 InnoDB 存儲引擎提供了一個非常重要的組件,就是 redo log buffer 組件.,它也是內(nèi)存里的一塊緩沖區(qū)。

redo log buffer 的使用原理:

還是以上面的更新操作為例,當數(shù)據(jù)更新后,會記錄下數(shù)據(jù)更新的的關鍵信息,對應的就是 redo 日志,然后寫入 redo log buffer 里。

但是還是會有一個問題,上面說到,redo log buffer 也是在內(nèi)存里的。那當 MySQL 宕機時,由于內(nèi)存里的所有數(shù)據(jù)都會丟失,所以緩沖池的臟數(shù)據(jù)和 redo log buffer 的日志還是會全部丟失。
這樣會造成一種情況,客戶端收到更新成功的信息了,但是最后數(shù)據(jù)庫里頭的數(shù)據(jù)還是沒更新成功。

所以,redo log buffer 還有一個刷盤策略。正常是,當事務提交時,會將 redo log buffer 里的 redo 日志 刷回到磁盤中,這樣就不用擔心,事務提交成功,但是更新數(shù)據(jù)可能會丟失的問題了。即使在 緩沖池(Buffer Pool) 的臟數(shù)據(jù)刷回磁盤前, MySQL 宕機了,也不會丟失數(shù)據(jù),因為 MySQL 重啟時可以根據(jù)磁盤中的 redo 日志 恢復之前所有臟數(shù)據(jù)的更新。

總結(jié)

以上所述是小編給大家介紹的MySQL 學習總結(jié) 之 初步了解 InnoDB 存儲引擎的架構設計,希望對大家有所幫助!

相關文章

  • MySQL 性能優(yōu)化的最佳20多條經(jīng)驗分享

    MySQL 性能優(yōu)化的最佳20多條經(jīng)驗分享

    今天,數(shù)據(jù)庫的操作越來越成為整個應用的性能瓶頸了,這點對于Web應用尤其明顯。關于數(shù)據(jù)庫的性能,這并不只是DBA才需要擔心的事,而這更是我們程序員需要去關注的事情。
    2010-07-07
  • dubbo中zookeeper請求超時問題:mybatis+spring連接mysql8.0.15的配置

    dubbo中zookeeper請求超時問題:mybatis+spring連接mysql8.0.15的配置

    這篇文章主要介紹了dubbo中zookeeper請求超時問題:mybatis+spring連接mysql8.0.15的配置,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • 詳解Mysql取前一天、前一周、后一天等時間函數(shù)

    詳解Mysql取前一天、前一周、后一天等時間函數(shù)

    本文給大家介紹Mysql取前一天、前一周、后一天等時間函數(shù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • MySQL數(shù)據(jù)庫之事務簡析

    MySQL數(shù)據(jù)庫之事務簡析

    這篇文章主要介紹了MySQL數(shù)據(jù)庫之事務簡析,MySQL數(shù)據(jù)庫中的事務是一組數(shù)據(jù)庫操作,它們被視為一個整體,要么全部執(zhí)行成功,要么全部失敗回滾,MySQL支持四種事務隔離級別,其中默認的事務隔離級別是REPEATABLE?READ,需要的朋友可以參考下
    2023-09-09
  • Ubuntu20下MySQL?8.0.28?安裝卸載方法圖文教程

    Ubuntu20下MySQL?8.0.28?安裝卸載方法圖文教程

    這篇文章主要為大家詳細介紹了Ubuntu20下MySQL?8.0.28?安裝卸載方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • MySQL中NULL對索引的影響深入講解

    MySQL中NULL對索引的影響深入講解

    這篇文章主要給大家介紹了關于MySQL中NULL對索引的影響的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用MySQL具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • 淺談mysql一張表到底能存多少數(shù)據(jù)

    淺談mysql一張表到底能存多少數(shù)據(jù)

    這篇文章主要介紹了淺談mysql一張表到底能存多少數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • mysql數(shù)據(jù)庫空間統(tǒng)計sql代碼示例

    mysql數(shù)據(jù)庫空間統(tǒng)計sql代碼示例

    在mysql中有一個information_schema數(shù)據(jù)庫,這個數(shù)據(jù)庫中裝的是mysql的元數(shù)據(jù),包括數(shù)據(jù)庫信息、數(shù)據(jù)庫中表的信息等,這篇文章主要給大家介紹了關于mysql數(shù)據(jù)庫空間統(tǒng)計sql的相關資料,需要的朋友可以參考下
    2024-08-08
  • LEFT JOIN關聯(lián)表中ON,WHERE后面跟條件的區(qū)別

    LEFT JOIN關聯(lián)表中ON,WHERE后面跟條件的區(qū)別

    本文主要介紹了LEFT JOIN關聯(lián)表中ON,WHERE后面跟條件的區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • MySQL啟動1053錯誤解決方法

    MySQL啟動1053錯誤解決方法

    創(chuàng)建mysql服務時,系統(tǒng)已提示創(chuàng)建服務成功,但是net start命令提示啟動失敗,并在services.msc中提示1053錯誤
    2012-11-11

最新評論