久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

一起來分析MySQL的update語句是怎樣執(zhí)行的

本篇文章給大家?guī)砹岁P(guān)于mysql的相關(guān)知識,其中主要介紹了關(guān)于一條update語句是怎樣執(zhí)行的相關(guān)問題,執(zhí)行update更新操作時,跟表有關(guān)的查詢緩存會失效,所以語句就會把表上所有緩存結(jié)果都清空,下面就一起來看一下,希望對大家有幫助。

一起來分析MySQL的update語句是怎樣執(zhí)行的

推薦學(xué)習(xí):mysql教程

前期準(zhǔn)備

首先創(chuàng)建一張表,然后插入三條數(shù)據(jù):

CREATE TABLE T( 	ID int(11) NOT NULL AUTO_INCREMENT, 	c int(11) NOT NULL, 	PRIMARY KEY (ID)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='測試表';INSERT INTO T(c) VALUES (1), (2), (3);

讓后執(zhí)行更新操作:

update T set c=c+1 where ID=2;

在說更新操作前,大家先來看一下sql語句在MySQL中的執(zhí)行流程~

SQL語句的執(zhí)行過程

一起來分析MySQL的update語句是怎樣執(zhí)行的

如圖所示:MySQL數(shù)據(jù)庫主要分為兩個層級:服務(wù)層存儲引擎層服務(wù)層:server層包括連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器,包括大多數(shù)MySQL中的核心功能所有跨存儲引擎的功能也在這一層實現(xiàn),包括 存儲過程、觸發(fā)器、視圖等。 存儲引擎層:存儲引擎層包括MySQL常見的存儲引擎,包括MyISAM、InnoDB和Memory等,最常用的是InnoDB,也是現(xiàn)在MySQL的默認(rèn)存儲引擎。

server層中的組件介紹

  • 連接器: 需要MySQL客戶端登錄,需要一個 連接器 來連接用戶和MySQL數(shù)據(jù)庫,“mysql -u 用戶名 -p 密碼” 進(jìn)行MySQL登錄,在完成 TCP握手 后,連接器會根據(jù)輸入的用戶名和密碼驗證登錄身份。

  • 查詢緩存: MySQL在得到一個執(zhí)行請求后,會首先去 查詢緩存 中查找,是否執(zhí)行過這條SQL語句,之前執(zhí)行過得語句以及結(jié)果會以 key-value對的形式,放在內(nèi)存中。key是查詢語句,value是查詢的結(jié)果。如果通過key能夠查找到這條SQL語句,直接返回SQL的執(zhí)行結(jié)果。若不存在緩存中,就會繼續(xù)后面的執(zhí)行階段。執(zhí)行完成后,執(zhí)行結(jié)果就會被放入查詢緩存中。優(yōu)點(diǎn)是效率高。但是查詢緩存不建議使用, 因為在MySQL中對某張表進(jìn)行了更新操作,那么所有的查詢緩存就會失效,對于更新頻繁的數(shù)據(jù)庫來說,查詢緩存的命中率很低。需要注意:在MySQL8.0版本,查詢緩存功能就刪除了,不存在查詢緩存的功能了

  • 分析器: 分為詞法分析和語法分析

    • 詞法分析: 首先,MySQL會根據(jù)SQL語句進(jìn)行解析,分析器會先做 詞法分析,你寫的SQL就是由多個字符串和空格組成的一條SQL語句,MySQL需要識別出里面的字符串是什么,代表什么。
    • 語法分析: 然后進(jìn)行 語法分析, 根據(jù)詞法分析的結(jié)果,語法分析器會根據(jù)語法規(guī)則,判斷輸入的這個SQL語句是否滿足MySQL語法。如果SQL語句不正確,就提示:You have an error in your SQL suntax
  • 優(yōu)化器: 經(jīng)過分析器分析后,SQL就合法了,但在執(zhí)行之前,還需要進(jìn)行優(yōu)化器的處理,優(yōu)化器會判斷使用了哪種索引,使用哪種連接,優(yōu)化器的作用 就是確定效率最高的執(zhí)行方案。

  • 執(zhí)行器: 在執(zhí)行階段,MySQL首先會判斷有沒有執(zhí)行語句的權(quán)限,若無權(quán)限,返回沒有權(quán)限的錯誤;若有權(quán)限,就打開表繼續(xù)執(zhí)行。打開表時,執(zhí)行器會根據(jù)標(biāo)的引擎定義,去使用該引擎提供的接口,對于有索引的表,執(zhí)行的邏輯類似。

了解完SQL語句的執(zhí)行流程我們接下來詳細(xì)分析一下上面update T set c=c+1 where ID=2;是如何執(zhí)行的。

Update語句分析

update T set c=c+1 where ID=2;

在執(zhí)行update更新操作的時候,跟這個表有關(guān)的查詢緩存會失效,所以這條語句就會把表 T 上所有緩存結(jié)果都清空。接下來,分析器會經(jīng)過語法分析和詞法分析,知道了這是一條更新語句后,優(yōu)化器決定要使用哪一個索引,然后執(zhí)行器負(fù)責(zé)具體的執(zhí)行,先找到這一行,然后做更新。

按照我們平常的思路,就是 找出這條記錄,把它的值改好,保存就OK了 。但我們追究一下細(xì)節(jié),由于涉及到修改數(shù)據(jù),所以涉及到日志了。更新操作涉及到兩個重要的日志模塊。redo log(重做日志)bin log(歸檔日志)。MySQL中的這兩個日志也是必學(xué)的。

redo log(重做日志)

  • 在 MySQL 里,如果每一次的更新操作都需要寫進(jìn)磁盤,然后磁盤也要找到對應(yīng)的那條記錄,然后再更新,整個過程 IO 成本、查找成本都很高。
    MySQL里使用WAL(預(yù)寫式日志)技術(shù),WAL 的全稱是 Write-Ahead Logging,它的關(guān)鍵點(diǎn)就是 先寫日志,再寫磁盤
  • 具體來說,當(dāng)有一條記錄需要更新的時候,InnoDB 引擎就會先把記錄寫到 redo log里面,并更新內(nèi)存,這個時候更新就算完成了。同時,InnoDB 引擎會在適當(dāng)?shù)臅r候,將這個操作記錄更新到磁盤里面,而這個更新往往是在系統(tǒng)比較空閑的時候做。
  • InnoDB 的 redo log 是固定大小的,比如可以配置為一組 4 個文件,每個文件的大小是 1GB,那么總共就可以記錄 4GB 的操作。從頭開始寫,寫到末尾就又回到開頭循環(huán)寫。

聽完上面對redo log日志的介紹后,小伙伴們可能會問:redo log日志存儲在哪?數(shù)據(jù)庫信息保存在磁盤上,redo log日志也保存在磁盤上,為什么要先寫到redo log中再寫到數(shù)據(jù)庫中呢?redo log日志如果存滿數(shù)據(jù)了怎么辦?等等。接下來就解答一下這些疑問。

redo log存儲在哪里?

InnoDB引擎先把記錄寫到redo log 中,redo log 在哪,它也是在磁盤上,這也是一個寫磁盤的過程, 但是與更新過程不一樣的是,更新過程是在磁盤上隨機(jī)IO,費(fèi)時。 而寫redo log 是在磁盤上順序IO。效率要高。

redo log 空間是固定,那它會不會用完呢?

首先不用擔(dān)心 redo log 會用完空間,因為它是循環(huán)利用的。例如 redo log 日志配置為一組4個文件,每個文件分別為1G。它寫的流程如下圖:
一起來分析MySQL的update語句是怎樣執(zhí)行的

簡單總結(jié)一下: redo log日志是Innodb存儲引擎特有的機(jī)制,可以用來應(yīng)對異常恢復(fù)Crash-safe,redo可以保證mysql異常重啟時,將未提交的事務(wù)回滾,已提交的事務(wù)安全落庫。

crash-safe: 有了 redo log,InnoDB 就可以保證即使數(shù)據(jù)庫發(fā)生異常重啟,之前提交的記錄都不會丟失,這個能力稱為crash-safe。

binlog(歸檔日志)

redo log是innoDB 引擎特有的日志。而binlog是mysql server層的日志。

其實bin log日志出現(xiàn)的時間比redo log早,因為最開始MySQL是沒有InnoDB存儲引擎的,5.5之前是MyISAM。但是 MyISAM 沒有 crash-safe 的能力,binlog 日志只能用于歸檔。而 InnoDB 是另一個公司以插件形式引入 MySQL 的,既然只依靠 binlog 是沒有 crash-safe 能力的,所以 InnoDB 使用另外一套日志系統(tǒng)——也就是 redo log 來實現(xiàn) crash-safe 能力。

redo logbin log的總結(jié)

  • redo log是為了保證innoDB引擎的crash-safe能力,也就是說在mysql異常宕機(jī)重啟的時候,之前提交的事務(wù)可以保證不丟失;(因為成功提交的事務(wù)肯定是寫入了redo log,可以從redo log恢復(fù))
  • bin log是歸檔日志,將每個更新操作都追加到日志中。這樣當(dāng)需要將日志恢復(fù)到某個時間點(diǎn)的時候,就可以根據(jù)全量備份+bin log重放實現(xiàn)。 如果沒有開啟binlog,那么數(shù)據(jù)只能恢復(fù)到全量備份的時間點(diǎn),而不能恢復(fù)到任意時間點(diǎn)。如果連全量備份也沒做,mysql宕機(jī),磁盤也壞了,那就很尷尬了。。

redo logbin log的區(qū)別:

  • redo log 是 InnoDB 引擎特有的;bin log 是 MySQL 的 Server 層實現(xiàn)的,所有引擎都可以使用。
  • redo log 是物理日志,記錄的是“在某個數(shù)據(jù)頁上做了什么修改”;bin log 是邏輯日志,記錄的是這個語句的原始邏輯,比如“給 ID=2 這一行的 c 字段加 1 ”。
  • redo log 是循環(huán)寫的,空間固定會用完;binlog 是可以追加寫入的。“追加寫”是指 binlog 文件寫到一定大小后會切換到下一個,并不會覆蓋以前的日志。

InnoDB引擎部分在執(zhí)行這個簡單的update語句的時候的內(nèi)部流程

update T set c=c+1 where ID=2;

一起來分析MySQL的update語句是怎樣執(zhí)行的

手動用begin開啟事務(wù),然后執(zhí)行update語句,再然后執(zhí)行commit語句,那上面的update更新流程之前 哪些是update語句執(zhí)行之后做的,哪些是commit語句執(zhí)行之后做的?

事實上,redo log在內(nèi)存中有一個redo log buffer,binlog 也有一個binlog cache.所以在手動開啟的事務(wù)中,你執(zhí)行sql語句,其實是寫到redo log bufferbinlog cache中去的(肯定不可能是直接寫磁盤日志,一個是性能差一個是回滾的時候不可能去回滾磁盤日志吧),然后當(dāng)你執(zhí)行commit的時候,首先要將redo log的提交狀態(tài)游prepare改為commit狀態(tài),然后就要把binlog cache刷新到binlog日志(可能也只是flush到操作系統(tǒng)的page cache,這個就看你的mysql配置),redo log buffer刷新到redo log 日志(刷新時機(jī)也是可以配置的)。 如果你回滾的話,就只用把binlog cacheredo log buffer中的數(shù)據(jù)清除就行了。

在update過程中,mysql突然宕機(jī),會發(fā)生什么情況?

  • 如果redolog寫入了,處于prepare狀態(tài),binlog還沒寫入,那么宕機(jī)重啟后,redolog中的這個事務(wù)就直接回滾了。

  • 如果redolog寫入了,binlog也寫入了,但redolog還沒有更新為commit狀態(tài),那么宕機(jī)重啟以后,mysql會去檢查對應(yīng)事務(wù)在binlog中是否完整。如果是,就提交事務(wù);如果不是,就回滾事務(wù)。 (redolog處于prepare狀態(tài),binlog完整啟動時就提交事務(wù),為啥要這么設(shè)計? 主要是因為binlog寫入了,那么就會被從庫或者用這個binlog恢復(fù)出來的庫使用,為了數(shù)據(jù)一致性就采用了這個策略)
    redo log和binlog是通過xid這個字段關(guān)聯(lián)起來的。

推薦學(xué)習(xí):mysql教程

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
日韩精品欧美大片| 色狠狠一区二区三区| а√在线中文在线新版| 青青青免费在线视频| 亚洲福利精品| 蜜桃久久av一区| 欧美一区二区三区久久精品| 欧美日本一区| 91青青国产在线观看精品| 久久中文字幕二区| 石原莉奈在线亚洲三区| 国产探花一区在线观看| 吉吉日韩欧美| 亚洲一区二区免费在线观看| 精品一区二区男人吃奶| 91精品蜜臀一区二区三区在线 | 精品视频黄色| 91九色精品| 欧美三级第一页| 韩国三级一区| 91p九色成人| 激情黄产视频在线免费观看| 蜜臀久久99精品久久久画质超高清| 欧美91在线|欧美| 制服诱惑一区二区| 久久99精品久久久野外观看| 国精品一区二区三区| 欧美日一区二区三区在线观看国产免| 日韩福利一区| 日韩美女国产精品| 久久久噜噜噜| 国产精品久久久久久av公交车 | 欧美日韩1区2区3区| 91精品国产91久久久久久黑人| 日韩三级久久| 久久久久久久久99精品大| 欧美一区91| 亚洲精品中文字幕乱码| 久久精品亚洲一区二区| 综合五月婷婷| 香蕉久久精品| 国模大尺度视频一区二区| 亚洲精品伊人| 亚洲激情欧美| 桃色一区二区| 国产精品chinese| 国产农村妇女精品一二区| 91麻豆国产自产在线观看亚洲| 日韩高清一区| 国产精品99一区二区| 精品国产午夜| 7m精品国产导航在线| 亚洲一区二区成人| 激情综合自拍| 亚洲精品国产嫩草在线观看| 久久精品99国产精品| 蜜臀精品久久久久久蜜臀| 今天的高清视频免费播放成人| 国精品产品一区| 欧美精品中文| 日韩精品高清不卡| 日韩制服丝袜先锋影音| 久久视频精品| 亚洲一区资源| 欧美交a欧美精品喷水| 亚洲欧美久久精品| 日韩制服丝袜先锋影音| 亚洲黄色在线| 激情五月综合| 久久精品影视| 成人va天堂| 久久男人av资源站| 97在线精品| 国内一区二区三区| 久久伊人国产| 精品国产欧美日韩一区二区三区| 国产欧美日韩影院| 国产日韩中文在线中文字幕| 婷婷精品在线| 一区二区国产精品| 先锋影音久久久| 国产亚洲亚洲| 中文久久精品| 国产精品人人爽人人做我的可爱| 九九在线精品| 亚洲免费观看| 国产精品普通话对白| 国产精品色网| 美女国产一区| 视频一区中文字幕国产| 美女久久一区| 亚洲人成精品久久久| 最新亚洲国产| 日韩黄色免费网站| 日韩av中文字幕一区| 奇米狠狠一区二区三区| 日本免费在线视频不卡一不卡二| 中文在线日韩| 日本不卡一二三区黄网| 日韩精品一页| 国产精品啊v在线| 精品日韩在线| 亚洲伦乱视频| 亚洲成人一区| 只有精品亚洲| 日本视频中文字幕一区二区三区| 国产午夜久久av| 精品在线网站观看| а√天堂8资源中文在线| 99久久九九| 亚洲免费高清| 亚洲精品大全| 国产精品亚洲片在线播放| 国产福利资源一区| 亚洲永久av| 不卡av一区二区| 亚洲毛片网站| 国产精品99久久久久久董美香| 国产在线日韩精品| 久久精品国产www456c0m| 免费欧美日韩| 国产免费久久| 精品国产第一福利网站| 日韩视频一区二区三区在线播放免费观看| 人人精品人人爱| 亚洲人成亚洲精品| 国产精品99久久久久久董美香| 黄色aa久久| 国产精品普通话对白| 国产精选久久| 日韩av首页| 午夜天堂精品久久久久| 麻豆精品一区二区综合av| 日韩和的一区二在线| 蜜臀久久久久久久| 成人亚洲精品| 亚洲欧美日韩综合国产aⅴ| 国产精品最新自拍| 国产99久久久国产精品成人免费| 亚洲精品伊人| 高清在线一区| 麻豆9191精品国产| 精品三区视频| 国产精品日韩久久久| 国产精品二区影院| 免费视频一区三区| 国产日韩精品视频一区二区三区| 亚洲最新无码中文字幕久久| 视频一区欧美精品| 高潮久久久久久久久久久久久久| 99视频+国产日韩欧美| 国产精品一区二区美女视频免费看| 亚洲精品在线影院| 日韩欧美精品一区二区综合视频| а√在线中文在线新版| 丝袜亚洲另类欧美| 精品视频网站| 日韩在线卡一卡二| 黄色在线观看www| 日韩在线成人| 久久麻豆精品| 国产精品**亚洲精品| 亚洲精品网址| 久久精品国产99国产| 一区二区高清| 久久国产亚洲| 国产欧美日韩在线观看视频| 亚洲五月婷婷| 国产精品777777在线播放| 亚洲免费影院| 风间由美中文字幕在线看视频国产欧美| 丝袜a∨在线一区二区三区不卡| 国产成人77亚洲精品www| 日韩在线视频一区二区三区| 日韩在线不卡| 国产欧美日韩精品一区二区三区| 在线视频观看日韩| 久久一区视频| 欧美一级二级三级视频| 国产精品免费看| 日韩精品免费一区二区在线观看| 国产日韩欧美高清免费| 三级欧美韩日大片在线看| 99久精品视频在线观看视频| 欧美国产另类| 蜜桃久久精品一区二区| 成人免费电影网址| 精品国产亚洲一区二区三区大结局| 色综合视频一区二区三区日韩 | 欧美日韩中出| 国产精品婷婷| 亲子伦视频一区二区三区| 国产精品极品| 日日摸夜夜添夜夜添国产精品| 久久视频精品| 欧产日产国产精品视频| 老司机精品视频网| 国产日韩欧美三级| 无码日韩精品一区二区免费| 国产美女一区|