MySQL中InnoDB存儲(chǔ)引擎的示例分析

這篇文章主要介紹MySQL中InnoDB存儲(chǔ)引擎的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到大洼網(wǎng)站設(shè)計(jì)與大洼網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋大洼地區(qū)。

一、存儲(chǔ)引擎

SQL 的執(zhí)行計(jì)劃是執(zhí)行器組件調(diào)用存儲(chǔ)引擎的接口來(lái)完成的。
那我們可以理解為:MySQL 這個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)是依靠存儲(chǔ)引擎與存放數(shù)據(jù)的磁盤(pán)文件進(jìn)行交互的。

那么 MySQL 有哪些存儲(chǔ)引擎呢?

主要有 MyISAM、InnoDB、Memory等等。而現(xiàn)在互聯(lián)網(wǎng)中,基本都是使用 InnoDB 存儲(chǔ)引擎,所以接下來(lái)我將簡(jiǎn)單總結(jié)自己關(guān)于 InnoDB 存儲(chǔ)引擎的學(xué)習(xí),比較簡(jiǎn)單的介紹 InnoDB 存儲(chǔ)引擎里面的組件。

二、緩沖池

我們現(xiàn)在都知道了,數(shù)據(jù)庫(kù)的數(shù)據(jù)是存放在磁盤(pán)文件中的。
那么,我們每次對(duì)表的增刪改查都是直接在磁盤(pán)文件里面操作嗎?

答案:不是的!

因?yàn)榇疟P(pán)文件的隨機(jī)讀寫(xiě)的性能是非常差的,如果所有操作都在磁盤(pán)中進(jìn)行,那么就不會(huì)有高性能 MySQL 的說(shuō)法了,MySQL 也不能支持高并發(fā),也不會(huì)在互聯(lián)網(wǎng)中如此的流行。

這時(shí)候要引入 InnoDB 存儲(chǔ)引擎最重要的一個(gè)組件,就是緩沖池(Buffer Pool),它是一個(gè)非常重要的內(nèi)存結(jié)構(gòu)。它是內(nèi)存里面的,憑借著內(nèi)存非常高性能的讀寫(xiě),使得 MySQL 能夠支持高并發(fā)。

緩沖池(Buffer Pool) 的使用原理:

我們先復(fù)習(xí)一下 MySQL 接收請(qǐng)求的過(guò)程。

①、MySQL 的工作線(xiàn)程專(zhuān)門(mén)監(jiān)聽(tīng)數(shù)據(jù)庫(kù)連接池的連接,有連接就獲取連接中的 SQL 語(yǔ)句。
②、然后將 SQL 語(yǔ)句交給 SQL 接口 去處理,SQL 接口里會(huì)進(jìn)行下面的一系列流程。
③、查詢(xún)解析器 將 SQL 語(yǔ)句解析成 MySQL 能理解的東西。
④、接著 查詢(xún)優(yōu)化器 去為 SQL 語(yǔ)句制定一套最優(yōu)的執(zhí)行計(jì)劃。
⑤、執(zhí)行器 會(huì)根據(jù)執(zhí)行計(jì)劃去調(diào)用存儲(chǔ)引擎的接口。

上面是上篇文章總結(jié)到的東西,那么存儲(chǔ)引擎的接口是怎么進(jìn)行增刪改查的呢?以更新操作為例,其他的同理。
首先,存儲(chǔ)引擎會(huì)先判斷更新 SQL 對(duì)應(yīng)的數(shù)據(jù)行是否在 緩沖池(Buffer Pool) 里面。如果在的話(huà)就直接在 緩沖池(Buffer Pool) 里更新數(shù)據(jù)然后返回;如果不在,則從磁盤(pán)文件里讀取數(shù)據(jù)到 緩沖池(Buffer Pool) 里,然后進(jìn)行更新操作,最后再返回結(jié)果。

三、undo 日志文件

我們都知道,在事務(wù)中,事務(wù)提交前是可以隨時(shí)回滾對(duì)數(shù)據(jù)的更新的。那么是依靠什么來(lái)做的呢?

依靠的是 undo 日志文件。

undo 日志文件的使用原理:

更新數(shù)據(jù)為例:
假如你更新某行 id=100 的數(shù)據(jù),將字段 name 由原來(lái)的“張三”改為“李四”,那么此時(shí)會(huì)將 "id=10" 和 “name=張三” 這兩個(gè)關(guān)鍵信息寫(xiě)入 undo 日志文件中。
當(dāng)你事務(wù)提交前需要回滾,就會(huì)從 undo 日志文件 中找到這兩個(gè)關(guān)鍵字,然后進(jìn)行更新操作的回滾。

四、redo log buffer

上面說(shuō)到,所有的增刪改查操作其實(shí)是在緩沖池里面進(jìn)行的,所以其實(shí)對(duì)數(shù)據(jù)的修改并沒(méi)有立刻落實(shí)到磁盤(pán)文件里面。

那么有一個(gè)問(wèn)題:在緩沖池的臟數(shù)據(jù)刷回磁盤(pán)文件中前,MySQL 宕機(jī)了怎么辦?
此時(shí) InnoDB 存儲(chǔ)引擎提供了一個(gè)非常重要的組件,就是 redo log buffer 組件.,它也是內(nèi)存里的一塊緩沖區(qū)。

redo log buffer 的使用原理:

還是以上面的更新操作為例,當(dāng)數(shù)據(jù)更新后,會(huì)記錄下數(shù)據(jù)更新的的關(guān)鍵信息,對(duì)應(yīng)的就是 redo 日志,然后寫(xiě)入 redo log buffer 里。

但是還是會(huì)有一個(gè)問(wèn)題,上面說(shuō)到,redo log buffer 也是在內(nèi)存里的。那當(dāng) MySQL 宕機(jī)時(shí),由于內(nèi)存里的所有數(shù)據(jù)都會(huì)丟失,所以緩沖池的臟數(shù)據(jù)和 redo log buffer 的日志還是會(huì)全部丟失。
這樣會(huì)造成一種情況,客戶(hù)端收到更新成功的信息了,但是最后數(shù)據(jù)庫(kù)里頭的數(shù)據(jù)還是沒(méi)更新成功。

所以,redo log buffer 還有一個(gè)刷盤(pán)策略。正常是,當(dāng)事務(wù)提交時(shí),會(huì)將 redo log buffer 里的 redo 日志 刷回到磁盤(pán)中,這樣就不用擔(dān)心,事務(wù)提交成功,但是更新數(shù)據(jù)可能會(huì)丟失的問(wèn)題了。即使在 緩沖池(Buffer Pool) 的臟數(shù)據(jù)刷回磁盤(pán)前, MySQL 宕機(jī)了,也不會(huì)丟失數(shù)據(jù),因?yàn)?MySQL 重啟時(shí)可以根據(jù)磁盤(pán)中的 redo 日志 恢復(fù)之前所有臟數(shù)據(jù)的更新。

以上是“MySQL中InnoDB存儲(chǔ)引擎的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章名稱(chēng):MySQL中InnoDB存儲(chǔ)引擎的示例分析
網(wǎng)站URL:http://muchs.cn/article8/ijooip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、微信公眾號(hào)、外貿(mào)建站、云服務(wù)器建站公司、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司

動(dòng)態(tài)網(wǎng)站知識(shí)