自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入淺出分析 Mysql 的 InnoDB 工作原理,硬核干貨!

數(shù)據(jù)庫 MySQL
InnoDB的Buffer Pool是MySQL用于緩存數(shù)據(jù)和索引頁的內(nèi)存區(qū)域,減少磁盤I/O,提升讀寫性能。Undo Log記錄事務(wù)修改前的數(shù)據(jù),用于回滾未提交的事務(wù)和實現(xiàn)MVCC。

一 、上期回顧

上次小編講了一條sql的執(zhí)行流程,總結(jié)如下:

  1. 解析器(Parser):檢查SQL語法,生成語法樹。
  2. 優(yōu)化器(Optimizer):選擇最優(yōu)執(zhí)行計劃,確定索引路徑。
  3. 執(zhí)行器(Executor):根據(jù)優(yōu)化器計劃,調(diào)用存儲引擎執(zhí)行操作。
  4. InnoDB存儲引擎

行級鎖:對特定記錄加鎖,避免并發(fā)沖突。

數(shù)據(jù)修改:實際更新記錄,記錄修改到redo log。

事務(wù)控制(ACID):事務(wù)提交或回滾,確保數(shù)據(jù)一致性和持久性。

  1. 返回結(jié)果:將執(zhí)行結(jié)果返回給客戶端。

然后小編也說了,InnoDB存儲引擎里面不止做了這幾件事,所以這期小編來聊聊InnoDB存儲引擎做了哪些事情。

二 、innoDB

2.1 一條更新sql語句的執(zhí)行流程圖

圖片圖片

2.2 buffer pool(innoDB)

Buffer Pool的定義

Buffer Pool 是一塊內(nèi)存區(qū)域,專門用于存儲數(shù)據(jù)庫的數(shù)據(jù)頁和索引頁,以便數(shù)據(jù)庫在查詢或更新數(shù)據(jù)時,能夠直接從內(nèi)存讀取而不是從磁盤讀取,極大地提高了查詢性能。

Buffer Pool的作用

  1. 緩存數(shù)據(jù)頁:當(dāng)用戶查詢數(shù)據(jù)時,InnoDB會首先查看Buffer Pool中是否已經(jīng)緩存了所需的數(shù)據(jù)。如果緩存命中,數(shù)據(jù)直接從內(nèi)存中讀取,速度快于從磁盤讀取。
  2. 減少磁盤I/O:由于磁盤I/O操作相對較慢,Buffer Pool能顯著減少數(shù)據(jù)庫對磁盤的讀取次數(shù),從而提高性能。
  3. 并發(fā)控制:InnoDB會管理對Buffer Pool的訪問,確保在并發(fā)情況下對內(nèi)存的訪問是高效的。

性能調(diào)優(yōu)建議

  1. 調(diào)整大小:合理分配Buffer Pool大小可以顯著提高性能。建議分配服務(wù)器可用內(nèi)存的一大部分給Buffer Pool,以減少磁盤訪問。
  2. 監(jiān)控和調(diào)整:使用命令SHOW ENGINE INNODB STATUS 或者查詢性能視圖來監(jiān)控Buffer Pool的使用情況,如命中率、讀取次數(shù)等,并根據(jù)需要調(diào)整Buffer Pool的大小。

另外 buffer pool既然是將物理磁盤的數(shù)據(jù)緩存起來,那么它的數(shù)據(jù)結(jié)構(gòu),內(nèi)存不夠時的淘汰策略等等,小編將新開一篇mysql innoDB的buffer pool單獨講解,有興趣的同學(xué)記的關(guān)注后續(xù)文章。

2.3 undo log(innoDB)

Undo Log的定義

Undo Log 是用于記錄數(shù)據(jù)在進(jìn)行修改之前的狀態(tài)的日志。當(dāng)一個事務(wù)執(zhí)行時,任何對數(shù)據(jù)的修改都會在修改前記錄到Undo Log中。如果事務(wù)因為某些原因失敗或被顯式回滾,InnoDB會利用Undo Log將數(shù)據(jù)恢復(fù)到修改前的狀態(tài)。

Undo Log的作用

  1. 事務(wù)回滾

如果一個事務(wù)在執(zhí)行過程中出現(xiàn)錯誤或者用戶顯式執(zhí)行ROLLBACK,InnoDB會利用Undo Log中的記錄將數(shù)據(jù)恢復(fù)到事務(wù)開始前的狀態(tài),確保事務(wù)的原子性。

  1. MVCC(多版本并發(fā)控制)
  • Undo Log幫助實現(xiàn)多版本并發(fā)控制(MVCC, Multiversion Concurrency Control)。當(dāng)一個事務(wù)在讀取數(shù)據(jù)時,可能有其他事務(wù)正在修改相同的數(shù)據(jù)。Undo Log允許未提交的事務(wù)看到修改前的數(shù)據(jù),而其他事務(wù)可以繼續(xù)訪問原始版本的記錄,確保事務(wù)之間的隔離性。
  1. 崩潰恢復(fù)
  • 如果數(shù)據(jù)庫因意外宕機或崩潰,未完成的事務(wù)會被回滾。數(shù)據(jù)庫在重新啟動時,可以通過分析Undo Log,將未提交的事務(wù)的修改回滾,從而確保數(shù)據(jù)一致性。

Undo Log與Redo Log的區(qū)別

  • Undo Log:主要用于事務(wù)回滾和MVCC。記錄的是數(shù)據(jù)修改前的舊值,以便在需要時回滾。
  • Redo Log:主要用于持久性(Durability)。記錄的是數(shù)據(jù)的修改操作,以便在系統(tǒng)崩潰后恢復(fù)事務(wù)的修改。

2.4 redo log(innoDB)

Redo Log的定義

Redo Log 是一種物理日志,記錄的是數(shù)據(jù)頁的修改操作,而不是具體的數(shù)據(jù)內(nèi)容。當(dāng)一個事務(wù)對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行修改時,InnoDB會先將這些修改操作記錄到Redo Log中,然后再將這些操作實際寫入到磁盤的數(shù)據(jù)文件中。

Redo Log的作用

  1. 數(shù)據(jù)恢復(fù):

在發(fā)生系統(tǒng)崩潰、宕機或硬件故障時,Redo Log能夠用于重做未完成的事務(wù),確保數(shù)據(jù)庫在恢復(fù)時仍然可以反映出所有已提交的事務(wù)修改。這是事務(wù)的持久性保證。

  1. 性能優(yōu)化:
  • Redo Log允許數(shù)據(jù)庫在不必每次修改都立即將數(shù)據(jù)寫入磁盤的情況下,先把修改記錄到日志中。這極大提高了性能,因為寫入日志通常比隨機寫入磁盤上的數(shù)據(jù)頁要快。
  • 數(shù)據(jù)修改可以在適當(dāng)?shù)臅r候(比如內(nèi)存不足時或達(dá)到一定的時間間隔時)通過后臺進(jìn)程慢慢刷新到磁盤文件中,而不影響事務(wù)的提交速度。
  1. 支持事務(wù)提交:
  • 當(dāng)事務(wù)執(zhí)行COMMIT時,InnoDB首先會將所有相關(guān)的修改操作寫入Redo Log,并確保這些日志已經(jīng)安全地存儲在磁盤上,之后事務(wù)才會被認(rèn)為是成功提交。即使在事務(wù)提交后數(shù)據(jù)庫發(fā)生崩潰,事務(wù)的修改也可以通過Redo Log來恢復(fù)。

Redo Log的工作原理

  • 當(dāng)事務(wù)開始修改數(shù)據(jù)時,InnoDB將修改操作記錄到Redo Log Buffer中。
  • 當(dāng)事務(wù)提交時,Redo Log Buffer中的日志會被同步到磁盤上的Redo Log文件(這個過程叫做 刷盤(fsync))。
  • 在后臺,InnoDB會根據(jù)一定的時間間隔或Buffer Pool中的壓力,將修改的數(shù)據(jù)頁從內(nèi)存刷新到磁盤文件中(這稱為 Checkpoint 機制)。
  • 如果數(shù)據(jù)庫崩潰或重啟,InnoDB會讀取Redo Log文件中的日志,并將其中未完成的事務(wù)操作重新應(yīng)用到數(shù)據(jù)庫中(重做(redo)),從而恢復(fù)數(shù)據(jù)。

Redo Log的性能調(diào)優(yōu)

  • 日志文件大小 (innodb_log_file_size):較大的日志文件可以減少Checkpoint的頻率,但會增加崩潰恢復(fù)的時間,因為日志文件越大,恢復(fù)時需要重做的日志條目也越多。
  • Redo Log Buffer大小 (innodb_log_buffer_size):如果事務(wù)提交頻率高,可以適當(dāng)增加Redo Log Buffer的大小,以減少刷盤的頻率。
  • 寫入頻率:通過innodb_flush_log_at_trx_commit參數(shù)控制事務(wù)提交時寫日志到磁盤的策略:

0:事務(wù)提交時不強制寫日志到磁盤,日志在后臺刷新。這種配置性能高但風(fēng)險較大。

1:每次事務(wù)提交時,Redo Log會立即刷入磁盤。這是默認(rèn)的設(shè)置,確保了事務(wù)的強持久性。

2:事務(wù)提交時,日志寫入文件系統(tǒng)緩存中,而不是立即寫入磁盤,崩潰時可能丟失部分?jǐn)?shù)據(jù)。

2.5 bin log(mysql)

Binlog的定義

Binlog是MySQL的二進(jìn)制日志,記錄了所有更改數(shù)據(jù)庫數(shù)據(jù)的語句以及與其相關(guān)的事務(wù)。它與InnoDB存儲引擎的Redo Log不同,Redo Log是用于恢復(fù)崩潰后未完成的事務(wù),而Binlog是記錄事務(wù)日志,用于備份、恢復(fù)和復(fù)制。

Binlog的作用

  1. 數(shù)據(jù)恢復(fù):

Binlog可以用作增量備份工具。通過定期備份Binlog文件,MySQL管理員可以將數(shù)據(jù)庫恢復(fù)到某一時刻之前的狀態(tài),然后通過應(yīng)用Binlog中的修改來恢復(fù)到崩潰前的最新狀態(tài)。與完整備份配合,能夠?qū)崿F(xiàn)更精細(xì)的恢復(fù)過程。

如果數(shù)據(jù)庫因某種原因崩潰,可以通過Point-in-Time Recovery(PITR,時間點恢復(fù)),將數(shù)據(jù)庫恢復(fù)到特定的時間點,或恢復(fù)到某個已知的穩(wěn)定狀態(tài)。

  1. 主從復(fù)制:

MySQL支持主從復(fù)制(Replication),其中主服務(wù)器上的數(shù)據(jù)更改會通過Binlog同步到從服務(wù)器。主服務(wù)器會將所有更改記錄到Binlog中,然后從服務(wù)器讀取并應(yīng)用這些日志,從而保持與主服務(wù)器的數(shù)據(jù)一致性。

這種機制使得可以創(chuàng)建冗余的從服務(wù)器來提高高可用性和讀性能,分擔(dān)查詢負(fù)載。

三 、總結(jié)

InnoDB的Buffer Pool是MySQL用于緩存數(shù)據(jù)和索引頁的內(nèi)存區(qū)域,減少磁盤I/O,提升讀寫性能。Undo Log記錄事務(wù)修改前的數(shù)據(jù),用于回滾未提交的事務(wù)和實現(xiàn)MVCC。Redo Log則記錄已提交事務(wù)的修改操作,確保系統(tǒng)崩潰后能夠恢復(fù)事務(wù),保證數(shù)據(jù)的持久性。Buffer Pool優(yōu)化了內(nèi)存使用,Undo Log維護(hù)事務(wù)一致性,Redo Log確保持久性與數(shù)據(jù)恢復(fù),三者協(xié)同保障InnoDB的高效性與可靠性。

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2018-12-25 08:00:00

2023-01-06 12:50:46

ChatGPT

2021-07-20 15:20:02

FlatBuffers阿里云Java

2019-11-11 14:51:19

Java數(shù)據(jù)結(jié)構(gòu)Properties

2018-03-15 09:13:43

MySQL存儲引擎

2019-11-14 09:53:30

Set集合存儲

2022-02-25 08:54:50

setState異步React

2021-07-19 11:54:15

MySQL優(yōu)先隊列

2011-07-04 10:39:57

Web

2013-11-14 15:53:53

AndroidAudioAudioFlinge

2021-03-16 08:54:35

AQSAbstractQueJava

2020-11-06 09:24:09

node

2021-08-10 14:10:02

Nodejs后端開發(fā)

2022-09-26 09:01:15

語言數(shù)據(jù)JavaScript

2015-08-06 14:02:31

數(shù)據(jù)分析

2019-08-22 10:57:42

MySQL數(shù)據(jù)索引

2009-03-16 13:44:29

雙向復(fù)制實例MySQL

2023-02-14 08:00:00

MySQL索引查詢

2022-12-02 09:13:28

SeataAT模式

2009-11-30 16:46:29

學(xué)習(xí)Linux
點贊
收藏

51CTO技術(shù)棧公眾號