最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

全部開發(fā)者教程

MySQL 進(jìn)階教程

首頁(yè) 慕課教程 MySQL 進(jìn)階教程 MySQL 進(jìn)階教程 MySQL 物理組成-一條更新語(yǔ)句是如何執(zhí)行的

MySQL 物理組成-一條更新語(yǔ)句是如何執(zhí)行的

上一小節(jié),我們介紹了MySQL的日志文件和數(shù)據(jù)文件,相信大家對(duì)MySQL的物理組成已經(jīng)有了一個(gè)初步認(rèn)識(shí)。本小節(jié),我們繼續(xù)深入,來(lái)看看一條更新語(yǔ)句在MySQL內(nèi)部是如何執(zhí)行的?以及 binlog(歸檔日志)和redo log(重做日志)在其中所起的重要作用。

1.一條更新語(yǔ)句是如何執(zhí)行的

相比查詢語(yǔ)句的執(zhí)行流程,更新語(yǔ)句的執(zhí)行流程多了兩個(gè)重要的日志模塊: binlog(歸檔日志)和redo log(重做日志) 。上一小節(jié),我們介紹了這兩個(gè)日志的基本概念,大家可能會(huì)有疑問(wèn),這兩份日志,到底有啥區(qū)別?為什么會(huì)有兩份日志呢?

1.1 binlog和redo log的區(qū)別

  • binlog是邏輯日志,記錄某個(gè)語(yǔ)句的基本邏輯,即SQL語(yǔ)句;redo log是物理日志,記錄在某個(gè)數(shù)據(jù)頁(yè)所做的修改;
  • binlog是在MySQL的Server層實(shí)現(xiàn),所有的存儲(chǔ)引擎都可以使用binlog這個(gè)日志模塊;redo log是InnoDB存儲(chǔ)引擎特有的日志模塊;
  • binlog是追加寫,在寫滿或重啟之后,會(huì)生成新的binlog文件,之前的日志不會(huì)進(jìn)行覆蓋;redo log是循環(huán)寫,空間大小是固定的;
  • binlog 是在事務(wù)最終提交前寫入的;redo log是在事務(wù)執(zhí)行過(guò)程不斷的寫入;
  • binlog可以應(yīng)用于數(shù)據(jù)歸檔、主從搭建等場(chǎng)景;redo log作為異常宕機(jī)或者介質(zhì)故障后的數(shù)據(jù)恢復(fù)使用;

1.2 為什么會(huì)有兩份日志

剛開始MySQL自帶的引擎是MyISAM,然而MyISAM并沒(méi)有crash-safe的能力,而binlog只能用于數(shù)據(jù)歸檔。InnoDB引擎是另外一家公司開發(fā)的MySQL插件,同時(shí)開發(fā)了redo log來(lái)實(shí)現(xiàn)crash-safe能力。從5.5.5版本開始,InnoDB成為MySQL的默認(rèn)存儲(chǔ)引擎,也是當(dāng)前最常用的存儲(chǔ)引擎。

**Tips:**crash-safe指數(shù)據(jù)庫(kù)發(fā)生故障重啟,之前提交的數(shù)據(jù)不會(huì)丟失

1.3 一條更新語(yǔ)句的執(zhí)行流程

update語(yǔ)句將id等于1這一行的value值加1

update a set value=value+1 where id=1;

表a擁有一個(gè)字段id和一個(gè)字段value

CREATE TABLE `a` (
  `id` int(11) DEFAULT NULL,
  `value` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

我們來(lái)看看這條update語(yǔ)句在MySQL內(nèi)部是如何執(zhí)行的?

  1. 執(zhí)行器通過(guò)引擎找到id=1這一行。如果id=1這一行的數(shù)據(jù)頁(yè)在內(nèi)存中,直接返回給執(zhí)行器;如果不在,則要從磁盤讀入內(nèi)存,再返回給執(zhí)行器;
  2. 執(zhí)行器拿到id=1這一行數(shù)據(jù),把value值加1,產(chǎn)生一行新的數(shù)據(jù),調(diào)用引擎接口寫入這行新的數(shù)據(jù);
  3. 引擎將新的這行數(shù)據(jù)更新到內(nèi)存中,同時(shí)將這個(gè)操作記錄到redo log,此時(shí)redo log處于prepare狀態(tài);
  4. 執(zhí)行器生成更新操作的binlog,并寫入磁盤;
  5. 執(zhí)行器調(diào)用引擎的事務(wù)提交接口,引擎將剛剛寫入的redo log改成commit提交狀態(tài),更新完成。

2.小結(jié)

一條更新語(yǔ)句的執(zhí)行過(guò)程,除了要經(jīng)過(guò)連接池、查詢緩存、解析器、優(yōu)化器、執(zhí)行器這幾個(gè)模塊之外,還涉及到兩個(gè)非常重要的日志模塊: binlog(歸檔日志)和redo log(重做日志)。
通過(guò)本文的講解,希望您對(duì)MySQL的物理組成有更深入的認(rèn)識(shí)。