欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL組提交group commit詳解

 更新時間:2022年07月01日 10:08:53   作者:長煙慢慢  
這篇文章主要介紹了MySQL組提交group commit知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

引 言

前提:

  • 以下討論的前提 是設(shè)置MySQL的crash safe相關(guān)參數(shù)為雙1:

sync_binlog=1

innodb_flush_log_at_trx_commit=1

背景說明:

  • WAL機制 (Write Ahead Log)定義: WAL指的是對數(shù)據(jù)文件進(jìn)行修改前,必須將修改先記錄日志。MySQL為了保證ACID中的一致性和持久性,使用了WAL。
  • Redo log的作用: Redo log就是一種WAL的應(yīng)用。當(dāng)數(shù)據(jù)庫忽然掉電,再重新啟動時,MySQL可以通過Redo log還原數(shù)據(jù)。也就是說,每次事務(wù)提交時,不用同步刷新磁盤數(shù)據(jù)文件,只需要同步刷新Redo log就足夠了。相比寫數(shù)據(jù)文件時的隨機IO,寫Redo log時的順序IO能夠提高事務(wù)提交速度。
  • 組提交的作用:
  • 在沒有開啟binlog時

Redo log的刷盤操作將會是最終影響MySQL TPS的瓶頸所在。為了緩解這一問題,MySQL使用了組提交,將多個刷盤操作合并成一個,如果說10個事務(wù)依次排隊刷盤的時間成本是10,那么將這10個事務(wù)一次性一起刷盤的時間成本則近似于1。

  • 當(dāng)開啟binlog時

為了保證Redo log和binlog的數(shù)據(jù)一致性,MySQL使用了二階段提交,由binlog作為事務(wù)的協(xié)調(diào)者。而 引入二階段提交 使得binlog又成為了性能瓶頸,先前的Redo log 組提交 也成了擺設(shè)。為了再次緩解這一問題,MySQL增加了binlog的組提交,目的同樣是將binlog的多個刷盤操作合并成一個,結(jié)合Redo log本身已經(jīng)實現(xiàn)的 組提交,分為三個階段(Flush 階段、Sync 階段、Commit 階段)完成binlog 組提交,最大化每次刷盤的收益,弱化磁盤瓶頸,提高性能。

圖解:

下圖我們假借“渡口運輸”的例子來看看binlog 組提交三個階段的流程:

在MySQL中每個階段都有一個隊列,每個隊列都有一把鎖保護(hù),第一個進(jìn)入隊列的事務(wù)會成為leader,leader領(lǐng)導(dǎo)所在隊列的所有事務(wù),全權(quán)負(fù)責(zé)整隊的操作,完成后通知隊內(nèi)其他事務(wù)操作結(jié)束。

Flush 階段 (圖中第一個渡口)

  • 首先獲取隊列中的事務(wù)組
  • 將Redo log中prepare階段的數(shù)據(jù)刷盤(圖中Flush Redo log)
  • 將binlog數(shù)據(jù)寫入文件,當(dāng)然此時只是寫入文件系統(tǒng)的緩沖,并不能保證數(shù)據(jù)庫崩潰時binlog不丟失 (圖中Write binlog)
  • Flush階段隊列的作用是提供了Redo log的組提交
  • 如果在這一步完成后數(shù)據(jù)庫崩潰,由于協(xié)調(diào)者binlog中不保證有該組事務(wù)的記錄,所以MySQL可能會在重啟后回滾該組事務(wù)

Sync 階段 (圖中第二個渡口)

  • 這里為了增加一組事務(wù)中的事務(wù)數(shù)量,提高刷盤收益,MySQL使用兩個參數(shù)控制獲取隊列事務(wù)組的時機:

binlog_group_commit_sync_delay=N:在等待N μs后,開始事務(wù)刷盤(圖中Sync binlog)

binlog_group_commit_sync_no_delay_count=N:如果隊列中的事務(wù)數(shù)達(dá)到N個,就忽視binlog_group_commit_sync_delay的設(shè)置,直接開始刷盤(圖中Sync binlog)

  • Sync階段隊列的作用是支持binlog的組提交
  • 如果在這一步完成后數(shù)據(jù)庫崩潰,由于協(xié)調(diào)者binlog中已經(jīng)有了事務(wù)記錄,MySQL會在重啟后通過Flush 階段中Redo log刷盤的數(shù)據(jù)繼續(xù)進(jìn)行事務(wù)的提交

Commit 階段 (圖中第三個渡口)

  • 首先獲取隊列中的事務(wù)組
  • 依次將Redo log中已經(jīng)prepare的事務(wù)在引擎層提交(圖中InnoDB Commit)
  • Commit階段不用刷盤,如上所述,F(xiàn)lush階段中的Redo log刷盤已經(jīng)足夠保證數(shù)據(jù)庫崩潰時的數(shù)據(jù)安全了
  • Commit階段隊列的作用是承接Sync階段的事務(wù),完成最后的引擎提交,使得Sync可以盡早的處理下一組事務(wù),最大化組提交的效率

缺陷分析:

本文最后要討論的bug(可通過閱讀原文查看)就是來源于Sync 階段中的那個binlog參數(shù)binlog_group_commit_sync_delay,在MySQL 5.7.19中,如果該參數(shù)不為10的倍數(shù),則會導(dǎo)致事務(wù)在Sync 階段等待極大的時間,表現(xiàn)出來的現(xiàn)象就是執(zhí)行的sql長時間無法返回。該bug已在MySQL 5.7.24和8.0.13被修復(fù)。

到此這篇關(guān)于MySQL組提交(group commit)的文章就介紹到這了,更多相關(guān)MySQL組提交內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql賬號管理與引擎相關(guān)功能實現(xiàn)流程

    Mysql賬號管理與引擎相關(guān)功能實現(xiàn)流程

    Mysql中的每一種技術(shù)都使用不同的存儲機制、索引技巧、鎖定水平、并且最終提供廣泛的不同功能和能力。通過選擇不同的技術(shù),你能夠獲得額外的速度或者功能,從而改善應(yīng)用的整體功能。這些不同的技術(shù)以及配套的相關(guān)功能在MySQL中被稱作存儲引擎
    2022-10-10
  • 詳細(xì)聊聊關(guān)于Mysql聯(lián)合查詢的那些事兒

    詳細(xì)聊聊關(guān)于Mysql聯(lián)合查詢的那些事兒

    聯(lián)合查詢union將多次查詢(多條select語句)的結(jié)果,在字段數(shù)相同的情況下,在記錄的層次上進(jìn)行拼接,這篇文章主要給大家介紹了關(guān)于Mysql聯(lián)合查詢的那些事兒,需要的朋友可以參考下
    2021-10-10
  • 修改MySQL所有表的編碼或修改某個字段的編碼步驟詳解

    修改MySQL所有表的編碼或修改某個字段的編碼步驟詳解

    這篇文章主要給大家介紹了關(guān)于修改MySQL所有表的編碼或修改某個字段編碼的相關(guān)資料,在進(jìn)行數(shù)據(jù)庫編碼更改之前,需要先確定目標(biāo)編碼格式,常見的編碼格式有UTF-8、GBK等,需要的朋友可以參考下
    2023-12-12
  • mysql表優(yōu)化、分析、檢查和修復(fù)的方法詳解

    mysql表優(yōu)化、分析、檢查和修復(fù)的方法詳解

    這篇文章主要介紹了mysql表優(yōu)化、分析、檢查和修復(fù)的方法,結(jié)合實例形式較為詳細(xì)的分析了MySQL表進(jìn)行優(yōu)化,分析與修復(fù)等操作的各種常見命令與使用技巧,需要的朋友可以參考下
    2016-04-04
  • MySQL性能壓力基準(zhǔn)測試工具sysbench的使用簡介

    MySQL性能壓力基準(zhǔn)測試工具sysbench的使用簡介

    這篇文章主要介紹了MySQL性能壓力基準(zhǔn)測試工具sysbench的使用簡介,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-04-04
  • Mysql?8.0解壓版下載安裝以及配置的實例教程

    Mysql?8.0解壓版下載安裝以及配置的實例教程

    MySQL的安裝分為兩種,一種是安裝版本,一種是免安裝解壓版本,一般老師都會推薦免安裝解壓版本,用起來更方便些,下面這篇文章主要給大家介紹了關(guān)于Mysql?8.0解壓版下載安裝以及配置的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 一文教你如何使用MySQL觸發(fā)器

    一文教你如何使用MySQL觸發(fā)器

    觸發(fā)器(TRIGGER)是MySQL的數(shù)據(jù)庫對象之一,是一種特殊類型的存儲過程,從5.0版本開始支持,下面這篇文章主要給大家介紹了關(guān)于如何使用MySQL觸發(fā)器的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • MySQL主從配置及haproxy和keepalived搭建過程解析

    MySQL主從配置及haproxy和keepalived搭建過程解析

    這篇文章主要介紹了MySQL主從配置及haproxy和keepalived搭建,本次運行環(huán)境是在docker中,也會介紹一些docker的知識,需要的朋友可以參考下
    2022-05-05
  • MySQL表自增id溢出的故障復(fù)盤解決

    MySQL表自增id溢出的故障復(fù)盤解決

    這篇文章主要介紹了MySQL表自增id溢出的故障復(fù)盤解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • MySql子查詢IN的執(zhí)行和優(yōu)化的實現(xiàn)

    MySql子查詢IN的執(zhí)行和優(yōu)化的實現(xiàn)

    本文主要介紹了MySql子查詢IN的執(zhí)行和優(yōu)化的實現(xiàn),詳細(xì)的介紹了為什么IN這么慢以及如何優(yōu)化,具有一定的參考價值,感興趣的可以了解一下
    2021-07-07

最新評論