關於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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...