三道MySQL新手入門面試題,通往自由的道路
1. 講講你認(rèn)識(shí)MySQL鎖吧
對(duì)于數(shù)據(jù)庫(kù)來講,讀寫都是非常頻繁的吧,在并發(fā)量來的時(shí)候,在進(jìn)行讀寫操作時(shí),可能會(huì)產(chǎn)生數(shù)據(jù)的不一致,這時(shí)候需要一些機(jī)制來保證訪問的次序,所以鎖就可以在一定限度保護(hù)它的一致性。
首先我們可以按鎖的粒度分:
1.表級(jí)鎖:它上鎖是鎖住的整張表,當(dāng)下一個(gè)事務(wù)來訪問的時(shí)候,必須等到當(dāng)前事務(wù)把鎖釋放了,才能對(duì)表進(jìn)行操作訪問。
特點(diǎn):表鎖開銷小,加鎖快,然后它的鎖的粒度最大,不會(huì)出現(xiàn)死鎖的現(xiàn)象,發(fā)送鎖的沖突的概率最高,并發(fā)度最低。
2.行級(jí)鎖:它上鎖是鎖住一行或者多行的記錄,當(dāng)下個(gè)事務(wù)訪問的時(shí)候,只有被鎖住的字段不能訪問,其他可以正常的訪問操作。
特點(diǎn):行鎖開銷大,加鎖滿,然后它的鎖的粒度最小,會(huì)出現(xiàn)死鎖的現(xiàn)象,發(fā)送鎖的沖突的概率最低,并發(fā)度最高。
3.頁(yè)面鎖:它是介于表鎖和行鎖之間的一種鎖,它鎖住的是相鄰的行記錄。
特點(diǎn):因?yàn)樗墙橛诒礞i和行鎖之間的,開銷大、加鎖、鎖的粒度、發(fā)送鎖的沖突的概率、并發(fā)度都是中等一般的。也會(huì)出現(xiàn)死鎖的現(xiàn)象。
我們也可以按鎖的類別分類:
- 共享鎖:也稱為讀鎖,簡(jiǎn)稱s鎖,當(dāng)用戶對(duì)數(shù)據(jù)訪問時(shí),對(duì)數(shù)據(jù)加上讀鎖,其他的事務(wù)只能對(duì)數(shù)據(jù)也加上讀鎖,而不能加上寫鎖,知道所有的讀鎖釋放完成后,才能對(duì)數(shù)據(jù)進(jìn)行加寫鎖的操作。然后主要的特性就是加上讀鎖后,支持并發(fā)的讀取數(shù)據(jù),讀取數(shù)據(jù)的時(shí)候不能進(jìn)行修改數(shù)據(jù),避免重復(fù)讀的出現(xiàn),所以讀鎖也可以加多個(gè)。
- 排它鎖:也稱為寫鎖,簡(jiǎn)稱x鎖,當(dāng)用戶對(duì)數(shù)據(jù)進(jìn)行寫入的時(shí)候,對(duì)數(shù)據(jù)加上一個(gè)寫鎖,其他事務(wù)對(duì)數(shù)據(jù)不能加任何鎖包括讀鎖和寫鎖,只能等待寫鎖的釋放才能對(duì)數(shù)據(jù)進(jìn)行讀取或者寫入操作。主要的特性就是在數(shù)據(jù)修改的時(shí)候,不允許任何進(jìn)行訪問或修改,可以避免臟數(shù)據(jù)和臟讀的出現(xiàn),寫鎖只能加一個(gè),并且和其他的排它鎖和共享鎖互斥。
- 意向共享鎖:當(dāng)一個(gè)事務(wù)試圖對(duì)整個(gè)表加上共享鎖時(shí),會(huì)首先需要獲取到這個(gè)表的意向共享鎖。
- 意向排它鎖:當(dāng)一個(gè)事務(wù)試圖對(duì)整個(gè)表加上排它鎖時(shí),會(huì)首先需要獲取到這個(gè)表的意向排它鎖。
2. 你知道什么是事務(wù)、四大特性、隔離級(jí)別嗎?
事務(wù):
是數(shù)據(jù)庫(kù)從一種一致性狀態(tài)到另一種一致性的狀態(tài),即事務(wù)的操作,要么都執(zhí)行,要么都不執(zhí)行。比如事務(wù)是將一組業(yè)務(wù)操作中的多條SQL語(yǔ)句當(dāng)做一個(gè)整體,那么這個(gè)多條語(yǔ)句要么都成功執(zhí)行,要么都執(zhí)行失敗。而這數(shù)據(jù)庫(kù)引擎中,InnoDB是支持事務(wù),而MyIASM就不支持啦。
四大特性:
- Atomicity原子性:事務(wù)中的各項(xiàng)操作,要么全部執(zhí)行成功,要么全部執(zhí)行失敗。C
- onsistency一致性:數(shù)據(jù)庫(kù)總是從一個(gè)一致性狀態(tài)轉(zhuǎn)換為另一個(gè)一致性的狀態(tài)。表示事務(wù)結(jié)束后系統(tǒng)狀態(tài)一致。
- Isolation隔離性:表示多個(gè)事務(wù)并發(fā)訪問時(shí),事務(wù)之間是隔離的不可見的。一個(gè)事務(wù)不會(huì)影響到其他事務(wù)的運(yùn)行。
- Durabilty持久性:表示一個(gè)事務(wù)一旦提交成功,他對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)操作是永久性的。
而這ACID主要是由什么保證呢?
- A原子性是由undo log 日志保證的,它記錄了需要回滾的日志信息,事務(wù)回滾撤銷時(shí)就會(huì)執(zhí)行已經(jīng)成功的SQL語(yǔ)句
- C一致性是由其他三大特性保證,并且程序代碼要保證業(yè)務(wù)的一致性
- I隔離性是由MVCC保證
- D持久性是由內(nèi)存+redo log保證,mysql修改數(shù)據(jù)的同時(shí)在內(nèi)存和redo log日志中記錄這次操作,如果數(shù)據(jù)庫(kù)宕機(jī)的話,就可以從redo log中恢復(fù)。
隔離級(jí)別:
read-uncommitted
讀取未提交:最低的隔離級(jí)別,讀取尚未的提交的數(shù)據(jù),也被為臟讀,它可能會(huì)發(fā)生就是臟讀現(xiàn)象和不可重復(fù)讀和幻讀現(xiàn)象。read-committed
讀已提交:可以讀取并發(fā)事務(wù)中已經(jīng)提交的數(shù)據(jù),可以有效的阻止臟讀,但是每次讀取的值發(fā)生了改變,所以不可重復(fù)讀和幻讀仍有可能發(fā)生。repeatable-read
可重復(fù)讀:mysql的默認(rèn)隔離級(jí)別,對(duì)同一字段的讀取多次結(jié)果是一致的,可以阻止臟讀和不可重復(fù)讀,但是幻讀仍會(huì)發(fā)生。那幻讀就是本來我讀取的只有一行的數(shù)據(jù),此時(shí)再次讀取可能多了一行,此時(shí)就是幻讀了。serializable
可串行化:最高的隔離級(jí)別,可以有效的解決臟讀、不可重復(fù)讀、幻讀現(xiàn)象。但是效率會(huì)比較低。
隔離級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
read-uncommitted讀取未提交 | 可能會(huì)出現(xiàn) | 可能會(huì)出現(xiàn) | 可能會(huì)出現(xiàn) |
read-committed讀已提交 | 可以解決 | 可能會(huì)出現(xiàn) | 可能會(huì)出現(xiàn) |
repeatable-read可重復(fù)讀 | 可以解決 | 可以解決 | 可能會(huì)出現(xiàn) |
serializable可串行化 | 可以解決 | 可以解決 | 可以解決 |
對(duì)于數(shù)據(jù)一致性來說,隔離級(jí)別越高,越能夠保證數(shù)據(jù)的完整性和一致性,但是對(duì)并發(fā)的性能影響越大。大多數(shù)數(shù)據(jù)庫(kù)的默認(rèn)級(jí)別是read-committed讀已提交
,比如Oracle ,但是 對(duì)于MySQL 的默認(rèn)隔離級(jí)別是 repeatable-read
可重復(fù)讀。
3. MyISAM 和 InnoDB 存儲(chǔ)引擎的區(qū)別
對(duì)于引擎來說,我們可以使用一個(gè)命令來查看:
SHOW ENGINES;
比較重要的就是這兩個(gè)MyISAM和InnoDB。為什么呢,對(duì)于MySQL來說,5版本之前就是使用的MyISAM,而現(xiàn)在默認(rèn)就是InnoDB了。
MyISAM :
對(duì)于MyISAM來說并發(fā)性比較差,并且不支持事務(wù),所以相對(duì)來說,應(yīng)用的場(chǎng)景會(huì)比較少,主要特點(diǎn)有:
- 不支持事務(wù)操作,ACID四大特性也就不存在了。
- 不支持外鍵操作,如果強(qiáng)行增加外鍵,MySQL 不會(huì)報(bào)錯(cuò),只不過外鍵不起作用。
- MyISAM 支持的鎖是表級(jí)鎖,所以并發(fā)性能比較差,加鎖比較快,鎖沖突比較高,但是可以避免死鎖的情況。
- 存儲(chǔ)結(jié)構(gòu)中,MyISAM會(huì)在磁盤上存儲(chǔ)三個(gè)文件,文件名和表名相同,擴(kuò)展名分別是存儲(chǔ)表定義、存儲(chǔ)數(shù)據(jù)、存儲(chǔ)索引。
- MyISAM 支持的索引類型有 全局索引、B-Tree 索引
- 性能來說:SELECT 性能較高,適用于查詢較多的情況
InnoDB :
現(xiàn)在MySQL默認(rèn)的存儲(chǔ)引擎,相對(duì)于 MyISAM,InnoDB 存儲(chǔ)引擎有了較大的改變,主要特點(diǎn)有:
- 支持事務(wù)操作,具備事務(wù) ACID 隔離特性。
- InnoDB 支持外鍵操作。
- InnoDB 支持鎖不僅有行級(jí)鎖也支持表級(jí)鎖,行級(jí)鎖并發(fā)性能比較好,會(huì)發(fā)生死鎖的情況。
- 存儲(chǔ)結(jié)構(gòu)中,InnoDB 也有存儲(chǔ)表結(jié)構(gòu) 定義,但是不同的是,InnoDB 的表數(shù)據(jù)與索引數(shù)據(jù)是存儲(chǔ)在一起的,都位于 B+ 數(shù)的葉子節(jié)點(diǎn)上,而 MyISAM 的表數(shù)據(jù)和索引數(shù)據(jù)是分開的。
- InnoDB 有安全的日志文件,這個(gè)日志文件用于恢復(fù)因數(shù)據(jù)庫(kù)崩潰或其他情況導(dǎo)致的數(shù)據(jù)丟失問題,保證數(shù)據(jù)的一致性。
- InnoDB 和 MyISAM 支持的索引類型相同,但具體實(shí)現(xiàn)因?yàn)槲募Y(jié)構(gòu)的不同有很大差異。
- 性能來說,如果需要執(zhí)行大量的增刪改操作,推薦使用 InnoDB 存儲(chǔ)引擎。
兩者區(qū)別:
- 事務(wù):MYISAM不支持事務(wù),但是每次查詢都是原子性的,而Innodb是支持事務(wù)的。
- 鎖:MYISAM支持表級(jí)鎖,即每次操作都會(huì)對(duì)整個(gè)表枷鎖,而Innodb支持行級(jí)鎖,支持寫時(shí)高并發(fā)
- 外鍵:MYSIAM不支持外鍵,而Innodb支持外鍵約束
- 存儲(chǔ)表的總行數(shù):MYISAM支持儲(chǔ)表的總行數(shù),而Innodb不支持儲(chǔ)表的總行數(shù)
- 存儲(chǔ)文件:MYISAM存儲(chǔ)表有三個(gè)文件,索引文件,表結(jié)構(gòu)文件,數(shù)據(jù)文件,而Innodb是存儲(chǔ)一個(gè)共享文件,索引和數(shù)據(jù)存儲(chǔ)在一起,大小會(huì)受操作系統(tǒng)文件大小限制
- 場(chǎng)景:MYISAM適合讀比較多,而Innodb適合寫多。
總結(jié)
這篇文章就到這里了,如果這篇文章對(duì)你也有所幫助,希望您能多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
IDEA項(xiàng)目啟動(dòng)時(shí)Flyway數(shù)據(jù)庫(kù)遷移中的checksum不匹配問題及最新解決方案
面對(duì)IDEA項(xiàng)目啟動(dòng)時(shí)報(bào)出的Flyway遷移校驗(yàn)和不匹配問題,核心在于保持遷移腳本的一致性、正確管理和理解Flyway的工作機(jī)制,本文介紹IDEA項(xiàng)目啟動(dòng)時(shí)Flyway數(shù)據(jù)庫(kù)遷移中的checksum不匹配問題及最新解決方案,感興趣的朋友一起看看吧2024-01-01Springboot自動(dòng)裝配之注入DispatcherServlet的實(shí)現(xiàn)方法
這篇文章主要介紹了Springboot自動(dòng)裝配之注入DispatcherServlet,Springboot向外界提供web服務(wù),底層依賴了springframework中的web模塊來實(shí)現(xiàn),那么springboot在什么時(shí)機(jī)向容器注入DispatcherServlet這個(gè)核心類的呢?帶著這個(gè)問題一起通過本文學(xué)習(xí)吧2022-05-05淺談Spring 解決循環(huán)依賴必須要三級(jí)緩存嗎
這篇文章主要介紹了淺談Spring 解決循環(huán)依賴必須要三級(jí)緩存嗎,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10spring kafka框架中@KafkaListener 注解解讀和使用案例
Kafka 目前主要作為一個(gè)分布式的發(fā)布訂閱式的消息系統(tǒng)使用,也是目前最流行的消息隊(duì)列系統(tǒng)之一,這篇文章主要介紹了kafka @KafkaListener 注解解讀,需要的朋友可以參考下2023-02-02Java 利用dom方式讀取、創(chuàng)建xml詳解及實(shí)例代碼
這篇文章主要介紹了Java 利用dom方式讀取、創(chuàng)建xml的相關(guān)資料,需要的朋友可以參考下2017-03-03springboot?publish?event?事件機(jī)制demo分享
這篇文章主要介紹了springboot?publish?event?事件機(jī)制demo,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10