關於MySql 資料庫InnoDB存儲引擎介紹

来源:https://www.cnblogs.com/personblog/archive/2019/07/12/11177940.html
-Advertisement-
Play Games

熟悉MySQL的人,都知道InnoDB存儲引擎,如大家所知,Redo Log是innodb的核心事務日誌之一,innodb寫入Redo Log後就會提交事務,而非寫入到Datafile。之後innodb再非同步地將新事務的數據非同步地寫入Datafile,真正存儲起來。 那麼innodb引擎有了redo ...


  熟悉MySQL的人,都知道InnoDB存儲引擎,如大家所知,Redo Log是innodb的核心事務日誌之一,innodb寫入Redo Log後就會提交事務,而非寫入到Datafile。之後innodb再非同步地將新事務的數據非同步地寫入Datafile,真正存儲起來。

那麼innodb引擎有了redo log和buffer pool以後,為什麼能夠在提升性能的同時,還能保證不丟數據呢? Buffer Pool, Redo Log以及Datafile之間的具體關係是什麼呢。

另外Innodb還有一大堆概念,Dirty Page, LRU, LSN,Checkpoint等等,這些概念在Innodb里是什麼運作的呢?

下麵通過一張圖來告訴大家

Buffer Pool, Redo Log以及Datafile的關係

Innodb的原理

大家可以把innodb的事務寫入過程看成寫作一篇文章的過程。Innodb的寫入過程其實和我們寫作的過程是非常類似的。

試想,領導讓我們寫一篇文章,發表在論壇上。然後我們想到了一個絕佳的點子,並決定要放到文章里,可是手上還有其他事情,一時半會兒寫不完,又擔心過後忘了,領導還等著我們答覆,此時我們會怎麼做呢?我們一定會先大概構思個提綱,並把提綱和一些關鍵細節記錄到本子上,作為草稿,然後立刻告訴領導自己要寫什麼東西,讓其確認。最後等晚上有時間了,再根據草稿去斟詞酌句,編寫正稿。

在這個過程中,我們用到的幾個關鍵的東西:

我們的大腦,用來臨時暫時記住我們的點子

草稿,我們需要草稿來保證不會把點子和關鍵的細節給忘了

正稿,這是我們最終要輸出的東西

有了這幾個東西,我們不僅能確保我們不會錯過一篇漂亮的文章,還能快速告訴領導自己一定可以搞定這件事情。

Innodb實際上也用到了這幾個關鍵的東西:

Buffer Pool:就是我們的大腦

事務日誌:就是我們的草稿

Datafile:就是我們的正稿

只要按照之前寫文章的過程,來進行整個事務的寫入操作,不僅能保證不丟失數據,而且能夠快速響應。

一次寫入操作是一次事務,innodb首先把事務數據寫入到Buffer Pool和事務日誌中,也就是在大腦中記憶下來,並寫下草稿。然後就可以提交事務,響應客戶端了。之後innodb在“有時間的時候”,非同步地把這次寫入的數據從Buffer Pool,或者事務日誌中正式地寫入到Datafile中,形成“正稿”。

其中,innodb為了保證事務日誌這個“草稿”一定能無損地還原成正稿,還不能占用太多空間,事務日誌需要有以下特點:

事務日誌中一定保存了要寫入的所有數據內容

事務日誌只會把新事務追加在日誌最後,而不會去修改之前的內容

一旦事務數據被寫到datafile,事務日誌中的“草稿”就可以刪除了

通過上面3個特點我們可以看出,在形成“正稿”之前,“草稿”是不會被刪除的;同時,“草稿”的空間是可以被迴圈利用的;最後,只要“草稿”在,我們一定能寫出“正稿”。

這裡還需要說明的,是Recovery流程。也就是如果在形成“正稿”前,資料庫Crash了,我們需要重啟整個進程,伺服器,甚至只能把數據複製到另外一臺伺服器來進行恢復。這個時候,事務日誌這個“草稿”就發揮了它最大的作用——數據恢復。這也和我們在工作生活中常出現的問題——把事情忘了——非常類似。

Buffer Pool本質就是存儲於記憶體中的一個數據結構,記憶體和人的大腦一樣,是“健忘”的。資料庫Crash時,Buffer Pool中的數據極大可能“灰飛煙滅”了。因此,事務日誌就如我們貼心的“記事本”,它把我們的記憶,保存為“草稿”,當我們忘了的時候,就可以翻開,把記憶重新回想起來。

LSN和Checkpoint

上面介紹了一次寫入事務的情況,而資料庫在使用過程中,事務都是連續不斷,根據上面所述innodb邏輯,寫“草稿”和寫“正稿”速度和進度絕大部分情況下是不一樣的。

再繼續上面“寫作文章”例子,如果我們的文章很長,一天寫不完,而白天都有其他工作,我們只能記錄草稿,只有晚上回去才能繼續寫正稿。那麼我們就面臨一個問題:我們昨天寫到哪了。

最常見的辦法就是,每天晚上去對照一下草稿的內容和正稿的內容,以此來判斷寫到哪了,但這比較花時間,因為正稿中可能包含了很多華麗的語句,我們需要思考一下才能對比上內容。

另外一個更簡單的辦法,就是每天晚上寫完正稿後,我們在草稿上做個標記,標記下最後一條被寫為正稿的內容,這樣第二天晚上,我們就可以從這個標記的後面一條開始,繼續寫我們的正稿,而不需要去對比內容。

顯然第二個方法效率更高,而且沒有什麼額外的風險。因此innodb就使用了這個辦法。LSN是草稿上每一條記錄的編號,我們每天晚上標記下最後一條寫到正稿的記錄編號,這個標記的編號,就是Checkpoint。Innodb根據這個checkpoint,就可以很快知道上次回放到哪裡,同時也可以把這個編號之前的草稿,全部刪掉了。

 

轉載原文:http://www.360doc.com/content/18/0523/10/45882429_756316759.shtml

 


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

-Advertisement-
Play Games
更多相關文章
  • [toc] 純凈版虛擬機 1. 先安裝個虛擬機,登陸nginx官網 http://nginx.org/選擇一個穩定的版本 2. 右鍵複製地址,到新克隆的純凈虛擬機wget 下載 先yum install y wget 把源換成阿裡雲的 curl o /etc/yum.repos.d/CentOS B ...
  • Linux目錄和文件——查詢目錄和文件的命令 摘要:本文主要學習了在Linux系統中是如何查詢目錄和文件的。 which命令 which命令是根據PATH環境變數設置的路徑,去搜索執行文件。 基本語法 選項說明 使用舉例 type命令 type命令用來顯示指定命令的類型: 1)alias:別名。 2 ...
  • crontab 簡介 ​ crontab常見於Unix和類Unix的操作系統之中,用於設置周期性被執行的指令。編輯好的crontab會被存放於“crontab”文件中,以供之後讀取和執行。每個用戶可以擁有自己的crontab文件。通常,crontab存儲的指令被守護進程crond激活,crond常常 ...
  • 前言 近期時間在努力投簡歷加找工作中,將自己或者朋友遇到的面試題在此一一整理,後期將持續更新。。。 (由於博主起步階段水平有限,接觸的都是基礎題目,大佬不要見笑) 1、測試網路連通性的命令 ping:最基礎的就不解釋了 tracent(trace router的縮寫):判斷數據包到目的地經過的哪些節 ...
  • Windows10安裝的時候,出現 大概提示為:windows 無法安裝所需的文件。請確保全裝所需的所有文件可用,並重新啟動安裝。 本人在出現這個問題的原因,是因為U盤的'文件系統格式'不正確,這裡給出我的步驟,希望能幫助到大家解決問題. 1. 合理的使用工具製作'啟動盤'(如:Rufus、Ultr ...
  • Elasticsearch是一個分散式可拓展的實時搜索和分析引擎 文件存儲:Elasticsearch,面向文檔型資料庫,一條數據就是一個文檔,用JSON作為文檔序列化的格式 MySQL和Elasticsearch數據關係術語對比: 關係資料庫-資料庫-表-行-列 Elasticsearch-索引- ...
  • 1.數據增刪改 2.單表查詢 3.正則表達式 4.多表查詢 ​ 笛卡爾積 ​ 內連接 ​ 外鏈接 ​ 子查詢 一.數據的增刪改 為什麼不說查 因為查詢語句 有很多細節 所以先從簡單的說起 添加數據: 1.insert into table_name[column,[column2.....]] va ...
  • 一、在mysql主上的配置1.修改mysql的配置文件在[mysqld]組下麵添加如下內容 server-id=1 #給mysql服務設置一個編號,必須是唯一的log-bin=mysql-bin #開啟二進位日誌 重啟mysql服務 service mysqld restart關閉防火牆servic ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...