MySQL 8 日志系統(tǒng)到底比MYSQL 5.X好在哪里,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
創(chuàng)新互聯(lián)公司專業(yè)成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營(yíng)銷、軟文發(fā)稿等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計(jì)制作為您帶來(lái)效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。
實(shí)際上MYSQL 5.x的日志系統(tǒng)存在兩個(gè)問(wèn)題,導(dǎo)致一些性能問(wèn)題,尤其在高并發(fā)寫入和對(duì)數(shù)據(jù)修改的情況下,其中的瓶頸的問(wèn)題在于兩個(gè)瓶頸, 當(dāng)多線程訪問(wèn)數(shù)據(jù)在落入到 log_buffer 的情況下,還是需要獲取鎖讓寫入有順序性, 同時(shí)在獲取redo已經(jīng)將數(shù)據(jù)頁(yè)面寫入后,也會(huì)在log_buffer中將寫入到日志中的順序進(jìn)行一個(gè)重排,這也是需要有順序性.
有順序性則就會(huì)有鎖的需求,否則無(wú)法保證系統(tǒng)的硬性需求,所以性能的問(wèn)題在這個(gè)部分就會(huì)產(chǎn)生. 下面的源代碼中 log_sys->mutex, log_sys->flush_order_mutex, 對(duì)于日志的寫入產(chǎn)生了兩個(gè)鎖.
為什么MYSQL 8 要解決這個(gè)問(wèn)題,主要的原因是多CPU 在MYSQL中的使用越來(lái)越被支持,而瓶頸在于并發(fā)和順序之間的矛盾.
MYSQL 8 解決關(guān)于鎖的問(wèn)題,采用了另一種方式,因?yàn)橛涗洷仨氂许樞蛐?而不在增加鎖,則順序性如何完成, 這里MYSQL 8 采用的方式是預(yù)留空間的方式來(lái)對(duì)還未寫的日志預(yù)留空間,然后
通過(guò)預(yù)留的方式,將log_sys->mutex 數(shù)據(jù)鎖去掉 ,預(yù)留空間的方式可以進(jìn)行并發(fā)的寫入,保證了之前的部分的順序性,但又沒(méi)有相關(guān)的寫入的強(qiáng)制的順序性.
但這還沒(méi)有完全解決問(wèn)題,log_sys->flush_order_mutex 鎖是解決最終刷入到日志中的鎖. 如何避免這個(gè)鎖.
MYSQL 8 提出了新的一個(gè)數(shù)據(jù)結(jié)構(gòu),來(lái)解決以下幾個(gè)問(wèn)題
1 填補(bǔ)的數(shù)據(jù)并沒(méi)有完全填充滿, 而其中有空洞的問(wèn)題
2 怎么能不使用鎖來(lái)將信息繼續(xù)有序的刷入到日志中
這里MYSQL 8 采用了log_writer線程來(lái)檢測(cè)日志中LOG BUFFER 有沒(méi)有空洞的問(wèn)題,如果有寫入就會(huì)等待,通過(guò)并集的方式來(lái)確認(rèn)LOG BUFFER 寫入的日志是否有空洞,
上圖是官方給出的圖,通過(guò)并集很快的可以知道某個(gè)塊是否是空, 寫數(shù)據(jù)到log buffer也就從左到右的方式,并且看似是無(wú)序的但無(wú)序最終是有序的寫入,但不在使用原來(lái)的兩個(gè)鎖,進(jìn)行寫入數(shù)據(jù)的控制.
通過(guò)更細(xì)化的設(shè)計(jì),將原來(lái)的數(shù)據(jù)中的瓶頸化解, 這點(diǎn)的設(shè)計(jì),其實(shí)和MYSQL GROUP REPLICATION 的化解原有數(shù)據(jù)復(fù)制的瓶頸的想法有共同的地方.
其中把log buffer 中的對(duì)應(yīng)的dirty page 并不按照順序添加到flush list. 用戶寫完log buffer 可以將相應(yīng)的 log buffer 對(duì)應(yīng)的dirty page 添加到flush list列表中,InnoDB 用一個(gè)recent_closed 來(lái)記錄添加到flush list 的這一段log buffer 確認(rèn)是否連續(xù), 那么容易得出, flush list 上page lsn - recent_closed.size() 得到的lsn 用于做checkpoint同時(shí)InnoDB 后臺(tái)有Log_closer 線程定期檢查recent_closed 是否連續(xù), 如果連續(xù)就把 recent_closed buffer 向前推進(jìn), 那么checkpoint 的信息也可以往前推進(jìn)了.
這里借用某帖子關(guān)于MYSQL 8 改進(jìn)后整體的數(shù)據(jù)寫入的流程總結(jié)
在整體將MYSQL 8 相關(guān)的改進(jìn)過(guò)了一遍后, 發(fā)現(xiàn)以下幾個(gè)問(wèn)題
1 有鎖的設(shè)計(jì)相對(duì)簡(jiǎn)單,但有鎖的設(shè)計(jì)并發(fā)性差
2 無(wú)鎖的設(shè)計(jì)復(fù)雜,其中,中間段是優(yōu)化的方面,將原來(lái)有序的寫入,變?yōu)榱藷o(wú)序的寫入,加大了由于順序+鎖的方式造成的寫入的性能瓶頸
3 雖然是無(wú)鎖的設(shè)計(jì),但最終數(shù)據(jù)的寫入與原先設(shè)計(jì)的方式并沒(méi)有區(qū)別,都是有序的.
這里面覺(jué)得相關(guān)的數(shù)據(jù)處理方式,由整體,變?yōu)榉稚⑻幚?在重新歸位整體, 增加了多線程并發(fā)寫入的方式, 并且部分預(yù)處理了數(shù)據(jù)刷新到磁盤的方式提高了寫入的速度.
看完上述內(nèi)容,你們掌握MYSQL 8 日志系統(tǒng)到底比MYSQL 5.X好在哪里的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
分享題目:MYSQL8日志系統(tǒng)到底比MYSQL5.X好在哪里
文章鏈接:http://www.rwnh.cn/article10/gdohgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣、面包屑導(dǎo)航、外貿(mào)網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)