自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

InnoDB 隔離模式對 MySQL 性能的影響

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

過去的幾個月我寫了兩篇文章,一篇是InnoDB 事務(wù)歷史相關(guān)的危險債務(wù),另一篇是關(guān)于MVCC 可能導(dǎo)致MySQL嚴(yán)重的性能問題的真相。在這篇文章里我將討論一個相關(guān)的主題 – InnoDB 事務(wù)隔離模式,還有它們與MVCC(多版本并發(fā)控制)的關(guān)系,以及它們是如何影響MySQL性能的。

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

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

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

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

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

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

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

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

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

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

  1. select avg(length(c)) from sbtest1;  
  2. begin;  
  3. select avg(length(c)) from sbtest1;  
  4. select sleep(300);  
  5. commit

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

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

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

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

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

從SELECT方面還有一個重要的win - READ UNCOMMITTED隔離模式意味著InnoDB 不需要去檢查舊的行版本 - ***一行總是對的,這會使得性能有明顯的改善,尤其是當(dāng)undo空間已經(jīng)在磁盤上溢出,查找舊的行版本會造成大量的IO讀寫。

也許上面這個select avg(k) from sbtest1;是我能找到的***的查詢例子了,能與之類似的更新工作量。假使READ UNCOMMITTED隔離模式在一分鐘左右完成,我認(rèn)為在READ COMMITTED隔離模式下沒有完成過,因為新索引條目插入的速度要比掃描速度快。

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

英文原文:MySQL performance implications of InnoDB isolation modes

責(zé)任編輯:林師授 來源: 開源中國社區(qū)編譯
相關(guān)推薦

2022-11-17 08:00:18

JavaScript錯誤性能

2022-12-15 08:00:38

JavaScript錯誤性能

2012-05-07 08:18:42

程序日志性能

2024-07-05 15:52:34

2010-05-24 13:22:37

Swap空間

2011-08-23 12:20:47

筆記本評測

2019-05-17 09:05:54

MySQL查詢性能數(shù)據(jù)庫

2022-06-07 08:18:49

懶加載Web前端

2010-05-21 12:31:08

MySQL性能

2021-06-28 17:21:49

MySQL性能Java

2010-05-21 16:23:52

MySQL MyISA

2010-11-23 11:27:53

MySQL MyISA

2009-06-30 15:02:41

磁盤排序Oracle數(shù)據(jù)庫性能

2011-05-25 14:42:37

Oracle空間管理系統(tǒng)性能

2017-11-10 10:49:47

SCSI軟件層性能

2010-05-10 17:07:54

Oracle SQL條

2015-05-04 09:56:19

HTTPS

2010-05-10 09:48:16

SQL Server數(shù)

2024-06-26 00:43:54

MySQL測試TOTAL?

2019-09-04 08:13:53

MySQLInnodb事務(wù)系統(tǒng)
點贊
收藏

51CTO技術(shù)棧公眾號