《高性能MySQL》學(xué)習(xí)筆記一架構(gòu)和歷史

????每個客戶端連接都會在服務(wù)器進程中擁有一個線程,該連接的所有查詢只會在這個單獨線程中執(zhí)行。5.5版本后提供一個API來支持線程池插件。

? ? 并發(fā)問題一般是通過實現(xiàn)一個由兩種類型的鎖組成的鎖系統(tǒng)來解決問題,這兩種類型的鎖通常被稱為共享鎖(讀鎖)和排他鎖(寫鎖)。讀鎖是共享的,也就是說同一時刻多個客戶讀取同一個資源將互不干擾;寫鎖時排他的,就是說只有一個客戶在寫入,且寫入的時候必須防止其他用戶讀取正在寫入的資源。

????需要調(diào)整自己的鎖策略,來在特定的應(yīng)用場景下提供更好的性能(平衡并發(fā)性以及鎖開銷),而不是僅僅簡單的使用行級鎖,而MySQL的多個存儲引擎都會自己的鎖策略和鎖粒度。

事務(wù)

????事務(wù)的ACID特性。

????事務(wù)的四種隔離級別:

未提交讀:事務(wù)的修改對其他事務(wù)都是可見的,可能帶來臟讀

提交讀:大多數(shù)數(shù)據(jù)庫支持,事務(wù)只能看見已提交的事務(wù)所做的修改,這個級別也叫不可重復(fù)讀,即兩次執(zhí)行同樣的查詢可能得到不同結(jié)果

可重復(fù)讀:MySQL默認的事務(wù)隔離級別,解決了臟讀,保證同一個事務(wù)多次讀取同樣的結(jié)果是一致的。但是無法解決幻讀。(InnoDB和XtraDB存儲引擎通過MVCC解決了幻讀問題)

可串行化:最高隔離級別,強制事務(wù)串行執(zhí)行。

?????除非事務(wù)中禁用了AUTOCOMMIT,否則任何時刻都不能顯式地執(zhí)行LOCK TABLES,不管使用的是什么存儲引擎,否則如果LOCK TABLES和事務(wù)相互影響的話情況會變得很復(fù)雜。

MVCC

????MySQL大多數(shù)存儲引擎實現(xiàn)的并不是簡單的行級鎖,它們一般同時實現(xiàn)了多版本并發(fā)控制(MVCC)。MVCC是行級鎖的一個變種,很多情況下都避免了加鎖,因此開銷更低,大多數(shù)MVCC都實現(xiàn)了非阻塞的讀操作,寫操作也只鎖定必要的行。

????InnoDB的MVCC是通過在每行記錄后面保存兩個隱藏的列來實現(xiàn)的,這兩個列一個保存了行的創(chuàng)建時間,一個保存了行的過期時間即版本號,事務(wù)開始的系統(tǒng)版本號會作為事務(wù)版本號,用來和查詢到的每行記錄的版本號進行比較,來達到一定的隔離級別。

????這樣做可以使大多數(shù)讀操作可以不用加鎖,可以使得讀操作簡單且性能好,并且保證只會讀取到符合標準的行。不足之處在于每行記錄都需要額外的存儲空間,需要做更多的行檢查工作以及一些額外的維護工作。

????MVCC只在提交讀和可重復(fù)讀兩個隔離級別下工作,其他兩個隔離級別都與MVCC不兼容。

存儲引擎

????使用.frm文件保存表的定義。

????InnoDB存儲引擎數(shù)據(jù)存儲在表空間中;采用MVCC來支持高并發(fā)并實現(xiàn)了四個標準的隔離級別,并且使用間隙鎖來防止出現(xiàn)幻讀(間隙鎖使得不僅僅鎖定查詢涉及的行,還會對索引中的間隙進行鎖定,防止幻影行的插入);基于聚簇索引建立的,其對主鍵查詢有很高的性能,但其二級索引必須包含主鍵列,所以表上索引過多的話主鍵必須盡可能??;內(nèi)部優(yōu)化很多,包括磁盤可預(yù)測性預(yù)讀、內(nèi)存中創(chuàng)建hash索引加速讀、增加插入緩沖區(qū)等。

????MyISAM存儲引擎在只有只讀數(shù)據(jù),小表和可容忍修復(fù)操作的表依然可以使用。將表存儲在兩個文件中,數(shù)據(jù)文件(.MYD)和索引文件(.MYI);可以包含動態(tài)和靜態(tài)行,動態(tài)行可處理的數(shù)據(jù)量默認是256TB,需要調(diào)節(jié)指針長度來實現(xiàn)調(diào)節(jié)數(shù)據(jù)量大?。ㄍㄟ^修改表的MAX_ROWS和AVG_ROW_LENGTH選項的值來實現(xiàn));對于不再修改的表可以使用壓縮表提升查詢性能。

????其他存儲引擎:

Archive引擎:只支持插入和查詢,不是一個事務(wù)型引擎,而是對高速插入和壓縮做了優(yōu)化,每次查詢都需要全表掃描,適用于日志和數(shù)據(jù)采集類應(yīng)用。

Blackhole引擎:沒有實現(xiàn)任何存儲機制,會丟棄所有插入數(shù)據(jù),不做任何保存,不推薦的引擎。

CSV引擎:可以將普通CSV文件(逗號分隔值的文件)作為MySQL的表來處理,不支持索引,可作為一種數(shù)據(jù)交換的機制。

Federated引擎:是訪問其他MySQL服務(wù)器的一個代理,會創(chuàng)建一個到遠程MySQL服務(wù)器的客戶端連接,然后當一個中間人的作用,但是經(jīng)常帶來問題,默認禁用。

Memory引擎:用于那些需要快速地訪問數(shù)據(jù),并且數(shù)據(jù)不會被修改,重啟后丟失也沒關(guān)系的表可以使用Memory表,該引擎因為所有數(shù)據(jù)都保存在內(nèi)存中,所以比MyISAM表快一個數(shù)量級(不需要進行磁盤I/O)。Memory表重啟后結(jié)構(gòu)會保存但是數(shù)據(jù)將丟失。存在表級鎖,并發(fā)能力低,不支持BLOB或TEXT類型的列,并且每行長度是固定的。如果MySQL在執(zhí)行查詢的過程中需要使用臨時表來保存中間結(jié)果,內(nèi)部使用的臨時表就是Memory表,但是當中間結(jié)果超過表的限制時,或者含有BLOB或TEXT類型,臨時表會轉(zhuǎn)換成MyISAM表。

Merge引擎:MyISAM引擎的變種,是多個MyISAM表合并而來的虛擬表。但當引入分區(qū)功能后,該引擎被棄用。

NDB集群引擎:MySQL集群引擎。

????除非需要用到某些InnoDB不具備的特性,并且沒有其他辦法可以替代,否則都應(yīng)該優(yōu)先選擇InnoDB引擎。除非萬不得已,否則建議不要混合使用多種存儲引擎,否則可能帶來一系列復(fù)雜問題。

????轉(zhuǎn)換存儲引擎的方式有:ALTER TABLE(嚴重消耗系統(tǒng)I/O能力)、導(dǎo)出與導(dǎo)入(注意可能導(dǎo)致的數(shù)據(jù)丟失操作)、創(chuàng)建與查詢(CREATE...LIKE,ALTER TABLE,INSERT..SELECT,數(shù)據(jù)量大時需考慮分批,必要時可加表鎖來保證強一致性)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容