【每日3分鐘技術(shù)干貨|面試題+答案|Mysql篇(一

1. 數(shù)據(jù)庫的三范式是什么?

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供合川網(wǎng)站建設(shè)、合川做網(wǎng)站、合川網(wǎng)站設(shè)計、合川網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、合川企業(yè)網(wǎng)站模板建站服務(wù),10年合川做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

  • 第一范式:強調(diào)的是列的原子性,即數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項。

  • 第二范式:要求實體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性。

  • 第三范式:任何非主屬性不依賴于其它非主屬性。

2. 一張自增表里面總共有 7 條數(shù)據(jù),刪除了最后 2 條數(shù)據(jù),重啟 MySQL 數(shù)據(jù)庫,又插入了一條數(shù)據(jù),此時 id 是幾?

  • 表類型如果是 MyISAM ,那 id 就是 8。

  • 表類型如果是 InnoDB,那 id 就是 6。

InnoDB 表只會把自增主鍵的最大 id 記錄在內(nèi)存中,所以重啟之后會導(dǎo)致最大 id 丟失。

3. 如何獲取當(dāng)前數(shù)據(jù)庫版本?

使用 select version() 獲取當(dāng)前 MySQL 數(shù)據(jù)庫版本。

4. 說一下 ACID 是什么?

  • Atomicity(原子性):一個事務(wù)(transaction)中的所有操作,或者全部完成,或者全部不完成,不會結(jié)束在中間某個環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯誤,會被恢復(fù)(Rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣。即,事務(wù)不可分割、不可約簡。

  • Consistency(一致性):在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預(yù)設(shè)約束、觸發(fā)器、級聯(lián)回滾等。

  • Isolation(隔離性):數(shù)據(jù)庫允許多個并發(fā)事務(wù)同時對其數(shù)據(jù)進行讀寫和修改的能力,隔離性可以防止多個事務(wù)并發(fā)執(zhí)行時由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。

  • Durability(持久性):事務(wù)處理結(jié)束后,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失。

5. char 和 varchar 的區(qū)別是什么?

  • char(n) :固定長度類型,比如訂閱 char(10),當(dāng)你輸入"abc"三個字符的時候,它們占的空間還是 10 個字節(jié),其他 7 個是空字節(jié)。

chat 優(yōu)點:效率高;缺點:占用空間;適用場景:存儲密碼的 md5 值,固定長度的,使用 char 非常合適。

  • varchar(n) :可變長度,存儲的值是每個值占用的字節(jié)再加上一個用來記錄其長度的字節(jié)的長度。

所以,從空間上考慮 varcahr 比較合適;從效率上考慮 char 比較合適,二者使用需要權(quán)衡。

6. float 和 double 的區(qū)別是什么?

  • float 最多可以存儲 8 位的十進制數(shù),并在內(nèi)存中占 4 字節(jié)。

  • double 最可可以存儲 16 位的十進制數(shù),并在內(nèi)存中占 8 字節(jié)。

7. MySQL 的內(nèi)連接、左連接、右連接有什么區(qū)別?

內(nèi)連接關(guān)鍵字:inner join;左連接:left join;右連接:right join。

內(nèi)連接是把匹配的關(guān)聯(lián)數(shù)據(jù)顯示出來;左連接是左邊的表全部顯示出來,右邊的表顯示出符合條件的數(shù)據(jù);右連接正好相反。

8. MySQL 索引是怎么實現(xiàn)的?

索引是滿足某種特定查找算法的數(shù)據(jù)結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)會以某種方式指向數(shù)據(jù),從而實現(xiàn)高效查找數(shù)據(jù)。

具體來說 MySQL 中的索引,不同的數(shù)據(jù)引擎實現(xiàn)有所不同,但目前主流的數(shù)據(jù)庫引擎的索引都是 B+ 樹實現(xiàn)的,B+ 樹的搜索效率,可以到達(dá)二分法的性能,找到數(shù)據(jù)區(qū)域之后就找到了完整的數(shù)據(jù)結(jié)構(gòu)了,所有索引的性能也是更好的。

9. 怎么驗證 MySQL 的索引是否滿足需求?

使用 explain 查看 SQL 是如何執(zhí)行查詢語句的,從而分析你的索引是否滿足需求。

explain 語法:explain select * from table where type=1。

10. 說一下數(shù)據(jù)庫的事務(wù)隔離?

MySQL 的事務(wù)隔離是在 MySQL. ini 配置文件里添加的,在文件的最后添加:

transaction-isolation = REPEATABLE-READ

可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。

  • READ-UNCOMMITTED:未提交讀,最低隔離級別、事務(wù)未提交前,就可被其他事務(wù)讀?。〞霈F(xiàn)幻讀、臟讀、不可重復(fù)讀)。

  • READ-COMMITTED:提交讀,一個事務(wù)提交后才能被其他事務(wù)讀取到(會造成幻讀、不可重復(fù)讀)。

  • REPEATABLE-READ:可重復(fù)讀,默認(rèn)級別,保證多次讀取同一個數(shù)據(jù)時,其值都和事務(wù)開始時候的內(nèi)容是一致,禁止讀取到別的事務(wù)未提交的數(shù)據(jù)(會造成幻讀)。

  • SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止臟讀、不可重復(fù)讀、幻讀。

臟讀 :表示一個事務(wù)能夠讀取另一個事務(wù)中還未提交的數(shù)據(jù)。比如,某個事務(wù)嘗試插入記錄 A,此時該事務(wù)還未提交,然后另一個事務(wù)嘗試讀取到了記錄 A。

不可重復(fù)讀 :是指在一個事務(wù)內(nèi),多次讀同一數(shù)據(jù)。

幻讀 :指同一個事務(wù)內(nèi)多次查詢返回的結(jié)果集不一樣。比如同一個事務(wù) A 第一次查詢時候有 n 條記錄,但是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產(chǎn)生了幻覺。發(fā)生幻讀的原因也是另外一個事務(wù)新增或者刪除或者修改了第一個事務(wù)結(jié)果集里面的數(shù)據(jù),同一個記錄的數(shù)據(jù)內(nèi)容被修改了,所有數(shù)據(jù)行的記錄就變多或者變少了。

11. 說一下 MySQL 常用的引擎?

  • InnoDB 引擎:InnoDB 引擎提供了對數(shù)據(jù)庫 acid 事務(wù)的支持,并且還提供了行級鎖和外鍵的約束,它的設(shè)計的目標(biāo)就是處理大數(shù)據(jù)容量的數(shù)據(jù)庫系統(tǒng)。MySQL 運行的時候,InnoDB 會在內(nèi)存中建立緩沖池,用于緩沖數(shù)據(jù)和索引。但是該引擎是不支持全文搜索,同時啟動也比較的慢,它是不會保存表的行數(shù)的,所以當(dāng)進行 select count(*) from table 指令的時候,需要進行掃描全表。由于鎖的粒度小,寫操作是不會鎖定全表的,所以在并發(fā)度較高的場景下使用會提升效率的。

  • MyIASM 引擎:MySQL 的默認(rèn)引擎,但不提供事務(wù)的支持,也不支持行級鎖和外鍵。因此當(dāng)執(zhí)行插入和更新語句時,即執(zhí)行寫操作的時候需要鎖定這個表,所以會導(dǎo)致效率會降低。不過和 InnoDB 不同的是,MyIASM 引擎是保存了表的行數(shù),于是當(dāng)進行 select count(*) from table 語句時,可以直接的讀取已經(jīng)保存的值而不需要進行掃描全表。所以,如果表的讀操作遠(yuǎn)遠(yuǎn)多于寫操作時,并且不需要事務(wù)的支持的,可以將 MyIASM 作為數(shù)據(jù)庫引擎的首選。

12. 說一下 MySQL 的行鎖和表鎖?

MyISAM 只支持表鎖,InnoDB 支持表鎖和行鎖,默認(rèn)為行鎖。

  • 表級鎖:開銷小,加鎖快,不會出現(xiàn)死鎖。鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)量最低。

  • 行級鎖:開銷大,加鎖慢,會出現(xiàn)死鎖。鎖力度小,發(fā)生鎖沖突的概率小,并發(fā)度最高。

13. 說一下樂觀鎖和悲觀鎖?

  • 樂觀鎖:每次去拿數(shù)據(jù)的時候都認(rèn)為別人不會修改,所以不會上鎖,但是在提交更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù)。

  • 悲觀鎖:每次去拿數(shù)據(jù)的時候都認(rèn)為別人會修改,所以每次在拿數(shù)據(jù)的時候都會上鎖,這樣別人想拿這個數(shù)據(jù)就會阻止,直到這個鎖被釋放。

數(shù)據(jù)庫的樂觀鎖需要自己實現(xiàn),在表里面添加一個 version 字段,每次修改成功值加 1,這樣每次修改的時候先對比一下,自己擁有的 version 和數(shù)據(jù)庫現(xiàn)在的 version 是否一致,如果不一致就不修改,這樣就實現(xiàn)了樂觀鎖。

14. MySQL 問題排查都有哪些手段?

  • 使用 show processlist 命令查看當(dāng)前所有連接信息。

  • 使用 explain 命令查詢 SQL 語句執(zhí)行計劃。

  • 開啟慢查詢?nèi)罩?,查看慢查詢?SQL。

15. 如何做 MySQL 的性能優(yōu)化?

  • 為搜索字段創(chuàng)建索引。

  • 避免使用 select *,列出需要查詢的字段。

  • 垂直分割分表。

  • 選擇正確的存儲引擎。

結(jié)語

就以這段話自勉、共勉吧。越努力、越幸運,如果你不是官二代、富二代、紅二代,那么請記?。呵趭^才是改變你命運的唯一捷徑。

歡迎在留言區(qū)留下你的觀點,一起討論提高。如果今天的文章讓你有新的啟發(fā),學(xué)習(xí)能力的提升上有新的認(rèn)識,歡迎轉(zhuǎn)發(fā)分享給更多人。

歡迎各位讀者加入程序員**知識碼頭**技術(shù)群,在公眾號后臺回復(fù)“加群”即可。

【每日3分鐘技術(shù)干貨 | 面試題+答案 | Mysql篇(一cdn.xitu.io/2019/10/2/16d8a808b767b831?imageView2/0/w/1280/h/960/format/webp/ignore-error/1">

猜你還想看

1.面試總問的jvm調(diào)優(yōu)到底是要干什么?

2.程序員應(yīng)該有什么樣的職業(yè)規(guī)劃?值得思考一下!

3.每日3分鐘技術(shù)干貨 | 面試題+答案 | jvm篇(一)

4.每日3分鐘技術(shù)干貨 | 面試題+答案 | jvm篇(二)

5.每日3分鐘技術(shù)干貨 | 面試題+答案 | redis篇(一)

【每日3分鐘技術(shù)干貨 | 面試題+答案 | Mysql篇(一

關(guān)注「程序員知識碼頭」,收看更多精彩內(nèi)容

當(dāng)前標(biāo)題:【每日3分鐘技術(shù)干貨|面試題+答案|Mysql篇(一
鏈接地址:http://bm7419.com/article30/pscsso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)動態(tài)網(wǎng)站、軟件開發(fā)企業(yè)建站、手機網(wǎng)站建設(shè)搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名