文章的目的主要是針對(duì)面試官的提問遗菠,做出盡可能精簡(jiǎn)而全面的回答联喘。若讀者對(duì)某塊的知識(shí)不能太理解,還請(qǐng)參閱其他大佬比較詳細(xì)的博客或者專業(yè)書籍辙纬,謝謝大家豁遭。
一.MySQL的存儲(chǔ)引擎
1.InnoDB:
? ? ? ? a.支持事務(wù),支持事務(wù)的四種隔離級(jí)別贺拣;是一種具有提交蓖谢、回滾和崩潰恢復(fù)能力的事務(wù)安全存儲(chǔ)引擎。
? ? ? ? b.支持行鎖和外鍵約束譬涡。
? ? ? ? c.一個(gè)Innodb表存儲(chǔ)在一個(gè)文件內(nèi)(共享表空間闪幽,表大小不受操作系統(tǒng)的限制),也可能為多個(gè)(設(shè)置為獨(dú)立表空間涡匀,表大小受操作系統(tǒng)限制盯腌,大小為2G),受操作系統(tǒng)文件大小的限制陨瘩。
? ? ? ? d.主鍵索引采用聚集索引(索引的數(shù)據(jù)域存儲(chǔ)數(shù)據(jù)文件本身)腕够,輔索引的數(shù)據(jù)域存儲(chǔ)主鍵的值级乍;因此從輔索引查找數(shù)據(jù),需要先通過輔索引找到主鍵值燕少,再訪問主鍵索引卡者;最好使用自增主鍵,防止插入數(shù)據(jù)時(shí)客们,為維持B+樹結(jié)構(gòu)崇决,文件的大調(diào)整。
? ? ? ? e.不存儲(chǔ)總行數(shù)底挫;也就是說恒傻,執(zhí)行select count(*) from table時(shí),InnoDB要掃描一遍整個(gè)表來計(jì)算有多少行建邓。注意的是盈厘,當(dāng)count(*)語句包含 where條件時(shí),兩種表的操作是一樣的官边。
? ? ? ? f.對(duì)于AUTO_INCREMENT類型的字段沸手,InnoDB中必須包含只有該字段的索引。
2.MyISAM:
? ? ? ? a.不支持事務(wù)注簿,但是整個(gè)操作是原子性的契吉。
? ? ? ? b.不支持外鍵,支持表鎖诡渴,每次鎖住的是整張表捐晶。(MyISAM的表鎖有讀鎖和寫鎖(兩個(gè)鎖都是表級(jí)別):表共享讀鎖和表獨(dú)占寫鎖。在對(duì)MyISAM表進(jìn)行讀操作時(shí)妄辩,不會(huì)阻塞其他用戶對(duì)同一張表的讀請(qǐng)求惑灵,但是會(huì)阻塞其他用戶對(duì)表的寫請(qǐng)求;對(duì)其進(jìn)行寫操作時(shí)會(huì)阻塞對(duì)同一表讀操作和寫操作MyISAM存儲(chǔ)引擎的讀鎖和寫鎖是互斥的眼耀,讀寫操作是串行的英支。那么,一個(gè)進(jìn)程請(qǐng)求某個(gè)MyISAM表的讀鎖哮伟,同時(shí)另一個(gè)進(jìn)程也請(qǐng)求同一表的寫鎖潭辈,MySQL如何處理呢?答案是寫進(jìn)程先獲得鎖澈吨。不僅如此把敢,即使讀請(qǐng)求先到鎖等待隊(duì)列,寫請(qǐng)求后到谅辣,寫鎖也會(huì)插到讀鎖請(qǐng)求之前修赞!這是因?yàn)镸ySQL認(rèn)為寫請(qǐng)求一般比讀請(qǐng)求要重要。這也正是MyISAM表不太適合于有大量更新操作和查詢操作應(yīng)用的原因,因?yàn)椋?b>大量的更新操作會(huì)造成查詢操作很難獲得讀鎖柏副,從而可能永遠(yuǎn)阻塞勾邦。這種情況有時(shí)可能會(huì)變得非常糟糕!)
? ? ? ? c.一個(gè)MyISAM表有三個(gè)文件:索引文件割择,表結(jié)構(gòu)文件眷篇,數(shù)據(jù)文件。
? ? ? ? d.采用非聚集索引荔泳,索引文件的數(shù)據(jù)域存儲(chǔ)指向數(shù)據(jù)文件的指針蕉饼。輔索引與主索引基本一致,但是輔索引不用保證唯一性玛歌。
? ? ? ? e.存儲(chǔ)表的總行數(shù)昧港,執(zhí)行select count(*) from table時(shí)只要簡(jiǎn)單的讀出保存好的行數(shù)即可。
? ? ? ? f.對(duì)于AUTO_INCREMENT類型的字段支子,在MyISAM表中创肥,可以和其他字段一起建立聯(lián)合索引。
3.Memory:
? ??????每個(gè)基于MEMORY存儲(chǔ)引擎的表實(shí)際對(duì)應(yīng)一個(gè)磁盤文件值朋。該文件的文件名與表名相同叹侄,類型為frm類型。該文件中只存儲(chǔ)表的結(jié)構(gòu)昨登。而其數(shù)據(jù)文件趾代,都是存儲(chǔ)在內(nèi)存中,這樣有利于數(shù)據(jù)的快速處理篙骡,提高整個(gè)表的效率稽坤。MEMORY默認(rèn)使用哈希索引(唯一支持哈希索引的存儲(chǔ)引擎)丈甸。速度比使用B型樹索引快糯俗。當(dāng)然如果你想用B型樹索引,可以在創(chuàng)建索引時(shí)指定睦擂。
4.Archive:
MySQL中的鎖
表級(jí)鎖:開銷小得湘,加鎖快;不會(huì)出現(xiàn)死鎖顿仇;鎖定粒度大淘正,發(fā)生鎖沖突的概率最高,并發(fā)度最低。
行級(jí)鎖:開銷大臼闻,加鎖慢鸿吆;會(huì)出現(xiàn)死鎖;鎖定粒度最小述呐,發(fā)生鎖沖突的概率最低,并發(fā)度也最高惩淳。
頁面鎖:開銷和加鎖時(shí)間界于表鎖和行鎖之間;會(huì)出現(xiàn)死鎖乓搬;鎖定粒度界于表鎖和行鎖之間思犁,并發(fā)度一般代虾。
二、事務(wù)的ACID
????????1.原子性(atomicity):一個(gè)事務(wù)必須視為一個(gè)不可分割的最小工作單元激蹲,整個(gè)事務(wù)中所有的操作要么全部提交成功棉磨,要么全部失敗回滾,對(duì)一個(gè)事務(wù)來說学辱,不可能只執(zhí)行其中的一部分操作乘瓤,這就是事務(wù)的原子性。
? ? ? ? 2.一致性(consistency):事務(wù)前后數(shù)據(jù)的完整性保持一致项郊。
? ? ? ? 3.隔離性(isolation):一個(gè)事務(wù)所做的修改在最終提交以前馅扣,對(duì)其他事務(wù)通常是不可見的。
? ? ? ? 4.持久性(durability):一旦事務(wù)提交着降,則其所做的修改就會(huì)永久保存到數(shù)據(jù)庫中差油。此時(shí)即使系統(tǒng)崩潰,修改的數(shù)據(jù)也不會(huì)丟失任洞。
三蓄喇、事務(wù)的隔離級(jí)別
? ? ? ? 1.READ UNCOMMITTED (未提交讀):一個(gè)事務(wù)可以讀取另一個(gè)未提交事務(wù)的數(shù)據(jù),這也稱為臟讀交掏。
? ? ? ? 2.READ COMMITTED (提交讀):一個(gè)事務(wù)要等另一個(gè)事務(wù)提交后才能讀取數(shù)據(jù)妆偏。但會(huì)出現(xiàn)一個(gè)事務(wù)范圍內(nèi)兩個(gè)相同的查詢卻返回了不同的數(shù)據(jù),稱為不可重復(fù)讀盅弛。
? ? ? ? 3.REPEATABLE READ (可重復(fù)讀):在開始讀取數(shù)據(jù)(事務(wù)開啟)的時(shí)候钱骂,不允許修改操作∨才簦可重復(fù)讀可以解決不可重復(fù)讀問題见秽。不可重復(fù)讀對(duì)應(yīng)的是修改即update操作,但是可能有幻讀問題讨盒,因?yàn)榛米x問題對(duì)應(yīng)的是插入insert操作解取,而不是update操作。
? ? ? ? 幻讀:當(dāng)某個(gè)事務(wù)在讀取某個(gè)范圍內(nèi)記錄時(shí)返顺,另外一個(gè)事務(wù)又在該范圍內(nèi)插入了新的記錄禀苦,當(dāng)之前的事務(wù)再次讀取該范圍記錄時(shí),會(huì)出現(xiàn)換行遂鹊。
? ? ? ? 4.SERIALIZABLE (可串行化):最高的隔離級(jí)別振乏,該級(jí)別下事務(wù)串行化順序執(zhí)行,可以避免臟讀秉扑、不可重復(fù)讀和幻讀慧邮。但是效率低下,比較耗數(shù)據(jù)庫的性能,會(huì)在讀取的每一個(gè)行都加鎖赋咽,所以會(huì)導(dǎo)致大量的超時(shí)和鎖爭(zhēng)用的問題旧噪。
四、多版本并發(fā)控制(MVCC)解決幻讀問題
持續(xù)更新E洹L灾印!E阏薄米母!覺得如果有幫助到你,麻煩評(píng)論喜歡加關(guān)注喲毡琉。