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

淺談InnoDB隔離模式的使用對(duì)MySQL性能造成的影響

 更新時(shí)間:2015年06月25日 09:34:56   投稿:goldensun  
這篇文章主要介紹了InnoDB隔離模式的使用對(duì)MySQL性能造成的影響,作為基于MySQL的最出名的數(shù)據(jù)庫(kù),InnoDB相關(guān)的性能問(wèn)題一直是DBA關(guān)注的熱點(diǎn),需要的朋友可以參考下

在這篇文章里我將討論一個(gè)相關(guān)的主題 – InnoDB 事務(wù)隔離模式,還有它們與MVCC(多版本并發(fā)控制)的關(guān)系,以及它們是如何影響MySQL性能的。

MySQL手冊(cè)提供了一個(gè)關(guān)于MySQL支持的事務(wù)隔離模式的恰當(dāng)描述 – 在這里我并不會(huì)再重復(fù),而是聚焦到對(duì)性能的影響上。

SERIALIZABLE – 這是最強(qiáng)的隔離模式,本質(zhì)上打敗了在鎖管理(設(shè)置鎖是很昂貴的)的條件下,多版本控制對(duì)所有選擇進(jìn)行鎖定造成大量的開(kāi)銷,還有你得到的并發(fā)。這個(gè)模式僅在MySQL應(yīng)用中非常特殊的情況下使用。


REPEATABLE READ – 這是默認(rèn)的隔離級(jí)別,通常它是相當(dāng)不錯(cuò)的,對(duì)應(yīng)用程序的便捷性來(lái)說(shuō)也不錯(cuò)。它在第一次的時(shí)候讀入所有數(shù)據(jù) (假設(shè)使用標(biāo)準(zhǔn)的非鎖讀)。但是這有很高的代價(jià) – InnoDB需要去維護(hù)事務(wù)記錄,從一開(kāi)始就要記錄,它的代價(jià)是非常昂貴的。更為嚴(yán)重的情況是,程序頻繁地更新和hot rows – 你真的就不想InnoDB去處理rows了,它有成百上千個(gè)版本。

在性能上的影響, 讀和寫都能夠被影響。用select查詢遍歷多個(gè)行是代價(jià)高昂的,對(duì)于更新(update)也是,在MySQL 5.6中,尤其是版本控制看起來(lái)導(dǎo)致了嚴(yán)重的爭(zhēng)用問(wèn)題。


下面是例子:完全在內(nèi)存中的數(shù)據(jù)集中運(yùn)行 sysbench,并啟動(dòng) transaction 、運(yùn)行全表、掃描、查詢幾次,同時(shí)保持 transaction 是開(kāi)著的:

sysbench --num-threads=64 --report-interval=10 --max-time=0 --max-requests=0 --rand-type=pareto --oltp-table-size=80000000 --mysql-user=root --mysql-password= --mysql-db=sbinnodb --test=/usr/share/doc/sysbench/tests/db/update_index.lua run

201571111758486.png (935×442)

正如你可以看到的,寫(write )操作的吞吐量大幅下降,并且持續(xù)走低,這時(shí)transaction 是開(kāi)著的,不僅是在查詢(query)操作運(yùn)行的時(shí)候。在可復(fù)讀的隔離模式下,當(dāng)你已經(jīng)選擇了之外的transaction ,緊接著就是一個(gè)long transaction ,這也許是我能找到的最糟糕情況了。當(dāng)然了你也會(huì)在其他情況下看到回歸算法(regression )。


如果有人想測(cè)試,可以重復(fù)下面我用的查詢集合:
 

select avg(length(c)) from sbtest1;
begin;
select avg(length(c)) from sbtest1;
select sleep(300);
commit;

不只是可復(fù)讀(Repeatable Read)的默認(rèn)隔離級(jí)別,同樣也可以用于InnoDB 邏輯備份 –  mydumper 或者 mysqldump –single-transaction

這些結(jié)果顯示這個(gè)備份的方法恢復(fù)的時(shí)間太長(zhǎng)而不能用于大型數(shù)據(jù)集合,同樣這個(gè)方法受到性能影響,也不能用于頻繁寫入(write )的環(huán)境中。

READ COMMITTED 模式和REPEATABLE READ模式很相似,本質(zhì)區(qū)別在于哪個(gè)版本都不在transaction中從頭開(kāi)始讀取,取而代之的從當(dāng)前語(yǔ)句開(kāi)始讀取。因此使用這種模式允許InnoDB少維護(hù)很多版本,特別是你沒(méi)有很長(zhǎng)的statements要允運(yùn)行。如果你有很長(zhǎng)的select要運(yùn)行,如報(bào)表查詢對(duì)性能的影響仍然很嚴(yán)重。

通常我認(rèn)為好的做法是把READ COMITTED隔離模式做為默認(rèn),對(duì)于應(yīng)用程序或者transactions 有必要就改成REPEATABLE READ。

READ UNCOMMITTED – 我覺(jué)得這是最難理解的隔離模式(悲催的只有2條文檔),只描述了它的邏輯觀點(diǎn)。如果你使用了這種隔離模式,你會(huì)看到數(shù)據(jù)控中所有發(fā)生的變化,即使是那些還沒(méi)被提交的transactions 。這種隔離模式一種好的用例是:你能“watch”到大規(guī)模的有臟讀(dirty reads)的UPDATE 語(yǔ)句,顯示了哪行被改變了,哪些沒(méi)有改變。

如果transaction 事務(wù)在運(yùn)行的時(shí)候出錯(cuò)了,那么這個(gè)聲明會(huì)顯示還沒(méi)被提交的和可能沒(méi)被提交的變化,所以使用這個(gè)模式要小心為妙。有一些用例雖然不需要我們100%準(zhǔn)確的數(shù)據(jù),在這種情況下,這種模式就變得非常方便。

那么,從性能角度來(lái)看,如何體現(xiàn)READ UNCOMMITTED?理論上,InnoDB 可以清除行版本,在READ UNCOMMITTED模式下即便是該語(yǔ)句已經(jīng)開(kāi)始執(zhí)行之后,也可以創(chuàng)建。在實(shí)踐中,由于一個(gè)bug或者一些復(fù)雜實(shí)現(xiàn)的細(xì)節(jié)做不到,語(yǔ)句開(kāi)始仍然是行版本。所以,如果你在READ UNCOMMITTED聲明中運(yùn)行很長(zhǎng)的SELECT,你會(huì)得到大量的行版本創(chuàng)建信息,就像你用了READ COMMITTED。No win here。

從SELECT方面還有一個(gè)重要的win - READ UNCOMMITTED隔離模式意味著InnoDB 不需要去檢查舊的行版本 - 最后一行總是對(duì)的,這會(huì)使得性能有明顯的改善,尤其是當(dāng)undo空間已經(jīng)在磁盤上溢出,查找舊的行版本會(huì)造成大量的IO讀寫。
 
也許上面這個(gè)select avg(k) from sbtest1;是我能找到的最好的查詢例子了,能與之類似的更新工作量。假使READ UNCOMMITTED隔離模式在一分鐘左右完成,我認(rèn)為在READ COMMITTED隔離模式下沒(méi)有完成過(guò),因?yàn)樾滤饕龡l目插入的速度要比掃描速度快。

最后思考:正確的使用InnoDB 隔離模式,能夠讓您的應(yīng)用程序得到最佳性能。你得到的好處可能不同,在某些情況下,也可能沒(méi)什么區(qū)別。關(guān)系到InnoDB 的歷史版本,似乎好有好多工作要做,我希望在未來(lái)的MySQL中能解決。

相關(guān)文章

  • 揭開(kāi)SQL中NULL的神秘面紗

    揭開(kāi)SQL中NULL的神秘面紗

    表的字段默認(rèn)允許存放NULL值,這意味著,您在插入記錄或者更新記錄時(shí),可以不為該字段指定值,此時(shí)該字段將存儲(chǔ)NULL值,這篇文章將揭開(kāi)SQL中NULL的神秘面紗。這個(gè)問(wèn)題可能困擾著很多初級(jí)開(kāi)發(fā)者
    2023-01-01
  • mysql中mysql-bin.000001是什么文件可以刪除嗎

    mysql中mysql-bin.000001是什么文件可以刪除嗎

    這篇文章主要介紹了mysql中mysql-bin.000001是什么文件可以刪除嗎,需要的朋友可以參考下
    2019-05-05
  • Mysql 用戶權(quán)限管理實(shí)現(xiàn)

    Mysql 用戶權(quán)限管理實(shí)現(xiàn)

    MySQL 是一個(gè)多用戶數(shù)據(jù)庫(kù),具有功能強(qiáng)大的訪問(wèn)控制系統(tǒng),可以為不同用戶指定不同權(quán)限。本文就來(lái)介紹一下Mysql 用戶權(quán)限管理實(shí)現(xiàn),感興趣的可以了解一下
    2021-05-05
  • MySQL MyISAM 與InnoDB 的區(qū)別

    MySQL MyISAM 與InnoDB 的區(qū)別

    這篇文章主要介紹了MySQL MyISAM與InnoDB 的區(qū)別,幫助大家更好的理解和使用MySQL的存儲(chǔ)引擎,感興趣的朋友可以了解下
    2020-09-09
  • MySQL 性能優(yōu)化的最佳20多條經(jīng)驗(yàn)分享

    MySQL 性能優(yōu)化的最佳20多條經(jīng)驗(yàn)分享

    今天,數(shù)據(jù)庫(kù)的操作越來(lái)越成為整個(gè)應(yīng)用的性能瓶頸了,這點(diǎn)對(duì)于Web應(yīng)用尤其明顯。關(guān)于數(shù)據(jù)庫(kù)的性能,這并不只是DBA才需要擔(dān)心的事,而這更是我們程序員需要去關(guān)注的事情。
    2010-07-07
  • 面試官問(wèn)我Mysql的存儲(chǔ)引擎了解多少

    面試官問(wèn)我Mysql的存儲(chǔ)引擎了解多少

    mysql面試中最常問(wèn)的問(wèn)題之一:小伙子,你說(shuō)一下你們公司用的存儲(chǔ)引擎,以及你知道有哪些存儲(chǔ)引擎和他們之間的區(qū)別? 所以下面這篇文章主要給大家介紹了關(guān)于Mysql存儲(chǔ)引擎的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • CentOS 7.2下MySQL的安裝與相關(guān)配置

    CentOS 7.2下MySQL的安裝與相關(guān)配置

    最近因?yàn)楣ぷ餍枰贑entOS上安裝MySQL,在安裝的時(shí)候遇到了一點(diǎn)問(wèn)題,花了點(diǎn)時(shí)間解決了,感覺(jué)不管是官網(wǎng)還是網(wǎng)上的一些教程都不夠完整,不能一次性幫新手解決問(wèn)題,于是我就結(jié)合官網(wǎng)和網(wǎng)上的資源整理了下,現(xiàn)在分享給大家,希望對(duì)有需要的朋友們能有所幫助。
    2016-11-11
  • Mysql中正則表達(dá)式Regexp常見(jiàn)用法及說(shuō)明

    Mysql中正則表達(dá)式Regexp常見(jiàn)用法及說(shuō)明

    這篇文章主要介紹了Mysql中正則表達(dá)式Regexp常見(jiàn)用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-12-12
  • Mysql及Navicat中設(shè)置字段自動(dòng)填充當(dāng)前時(shí)間及修改時(shí)間實(shí)現(xiàn)

    Mysql及Navicat中設(shè)置字段自動(dòng)填充當(dāng)前時(shí)間及修改時(shí)間實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于Mysql及Navicat中設(shè)置字段自動(dòng)填充當(dāng)前時(shí)間及修改時(shí)間實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 在Windows系統(tǒng)上使用壓縮歸檔文件安裝MySQL的步驟

    在Windows系統(tǒng)上使用壓縮歸檔文件安裝MySQL的步驟

    這篇文章主要介紹了在Windows系統(tǒng)上使用壓縮歸檔文件安裝MySQL的步驟,非常不錯(cuò),具有一定的參考借鑒加載,需要的朋友可以參考下
    2018-06-06

最新評(píng)論