????每個客戶端連接都會在服務(wù)器進(jìn)程中擁有一個線程传趾,該連接的所有查詢只會在這個單獨線程中執(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默認(rèn)的事務(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ù)版本號,用來和查詢到的每行記錄的版本號進(jìn)行比較思灰,來達(dá)到一定的隔離級別玷犹。
????這樣做可以使大多數(shù)讀操作可以不用加鎖,可以使得讀操作簡單且性能好洒疚,并且保證只會讀取到符合標(biāo)準(zhǔn)的行歹颓。不足之處在于每行記錄都需要額外的存儲空間,需要做更多的行檢查工作以及一些額外的維護工作油湖。
????MVCC只在提交讀和可重復(fù)讀兩個隔離級別下工作巍扛,其他兩個隔離級別都與MVCC不兼容。
存儲引擎
????使用.frm文件保存表的定義乏德。
????InnoDB存儲引擎數(shù)據(jù)存儲在表空間中电湘;采用MVCC來支持高并發(fā)并實現(xiàn)了四個標(biāo)準(zhǔn)的隔離級別,并且使用間隙鎖來防止出現(xiàn)幻讀(間隙鎖使得不僅僅鎖定查詢涉及的行鹅经,還會對索引中的間隙進(jì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ù)量默認(rèn)是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)建一個到遠(yuǎn)程MySQL服務(wù)器的客戶端連接藤树,然后當(dāng)一個中間人的作用,但是經(jīng)常帶來問題拓萌,默認(rèn)禁用岁钓。
Memory引擎:用于那些需要快速地訪問數(shù)據(jù),并且數(shù)據(jù)不會被修改微王,重啟后丟失也沒關(guān)系的表可以使用Memory表屡限,該引擎因為所有數(shù)據(jù)都保存在內(nèi)存中,所以比MyISAM表快一個數(shù)量級(不需要進(jìn)行磁盤I/O)炕倘。Memory表重啟后結(jié)構(gòu)會保存但是數(shù)據(jù)將丟失钧大。存在表級鎖,并發(fā)能力低罩旋,不支持BLOB或TEXT類型的列啊央,并且每行長度是固定的眶诈。如果MySQL在執(zhí)行查詢的過程中需要使用臨時表來保存中間結(jié)果,內(nèi)部使用的臨時表就是Memory表瓜饥,但是當(dāng)中間結(jié)果超過表的限制時逝撬,或者含有BLOB或TEXT類型,臨時表會轉(zhuǎn)換成MyISAM表乓土。
Merge引擎:MyISAM引擎的變種宪潮,是多個MyISAM表合并而來的虛擬表。但當(dāng)引入分區(qū)功能后帐我,該引擎被棄用坎炼。
NDB集群引擎:MySQL集群引擎。
????除非需要用到某些InnoDB不具備的特性拦键,并且沒有其他辦法可以替代谣光,否則都應(yīng)該優(yōu)先選擇InnoDB引擎。除非萬不得已芬为,否則建議不要混合使用多種存儲引擎萄金,否則可能帶來一系列復(fù)雜問題。
????轉(zhuǎn)換存儲引擎的方式有:ALTER TABLE(嚴(yán)重消耗系統(tǒng)I/O能力)媚朦、導(dǎo)出與導(dǎo)入(注意可能導(dǎo)致的數(shù)據(jù)丟失操作)氧敢、創(chuàng)建與查詢(CREATE...LIKE,ALTER TABLE询张,INSERT..SELECT孙乖,數(shù)據(jù)量大時需考慮分批,必要時可加表鎖來保證強一致性)