數據庫精選 60 道面試題

大家好,我是賀同學。

金三銀四到了,給大家整理一些數據庫必知必會的面試題。

基礎相關

1、關係型和非關係型數據庫的區別?


關係型數據庫的優點

非關係型數據庫(NOSQL)的優點

2、詳細說一下一條 MySQL 語句執行的步驟

Server 層按順序執行 SQL 的步驟爲:

索引相關

3、MySQL 使用索引的原因?

根本原因

擴展

4、索引的三種常見底層數據結構以及優缺點

三種常見的索引底層數據結構:分別是哈希表、有序數組和搜索樹。

5、索引的常見類型以及它是如何發揮作用的?

根據葉子節點的內容,索引類型分爲主鍵索引和非主鍵索引。

6、MyISAM 和 InnoDB 實現 B 樹索引方式的區別是什麼?

7、InnoDB 爲什麼設計 B+ 樹索引?

兩個考慮因素:

爲什麼選擇 B+ 樹:

8、什麼是覆蓋索引和索引下推?

覆蓋索引:

索引下推:

9、哪些操作會導致索引失效?

10、字符串加索引

日誌相關

11、MySQL 的 change buffer 是什麼?

12、MySQL 是如何判斷一行掃描數的?

13、MySQL 的 redo log 和 binlog 區別?

14、爲什麼需要 redo log?

15、爲什麼 redo log 具有 crash-safe 的能力,是 binlog 無法替代的?

第一點:redo log 可確保 innoDB 判斷哪些數據已經刷盤,哪些數據還沒有

第二點:如果 redo log 寫入失敗,說明此次操作失敗,事務也不可能提交

16、當數據庫 crash 後,如何恢復未刷盤的數據到內存中?

根據 redo log 和 binlog 的兩階段提交,未持久化的數據分爲幾種情況:

17、redo log 寫入方式?

redo log 包括兩部分內容,分別是內存中的日誌緩衝 (redo log buffer) 和磁盤上的日誌文件 (redo log file)。

MySQL 每執行一條 DML 語句,會先把記錄寫入 redo log buffer(用戶空間) ,再保存到內核空間的緩衝區 OS-buffer 中,後續某個時間點再一次性將多個操作記錄寫到 redo log file(刷盤) 。這種先寫日誌,再寫磁盤的技術,就是 WAL

可以發現,redo log buffer 寫入到 redo log file,是經過 OS buffer 中轉的。其實可以通過參數 innodb_flush_log_at_trx_commit 進行配置,參數值含義如下:

18、redo log 的執行流程?

我們來看下 Redo log 的執行流程,假設執行的 SQL 如下:

update T set a =1 where id =666

  1. MySQL 客戶端將請求語句 update T set a =1 where id =666,發往 MySQL Server 層。

  2. MySQL Server 層接收到 SQL 請求後,對其進行分析、優化、執行等處理工作,將生成的 SQL 執行計劃發到 InnoDB 存儲引擎層執行。

  3. InnoDB 存儲引擎層將 a 修改爲 1 的這個操作記錄到內存中。

  4. 記錄到內存以後會修改 redo log 的記錄,會在添加一行記錄,其內容是需要在哪個數據頁上做什麼修改

  5. 此後,將事務的狀態設置爲 prepare ,說明已經準備好提交事務了。

  6. 等到 MySQL Server 層處理完事務以後,會將事務的狀態設置爲 commit,也就是提交該事務。

  7. 在收到事務提交的請求以後,redo log 會把剛纔寫入內存中的操作記錄寫入到磁盤中,從而完成整個日誌的記錄過程。

19、binlog 的概念是什麼,起到什麼作用, 可以保證 crash-safe 嗎?

20、什麼是兩階段提交?

MySQL 將 redo log 的寫入拆成了兩個步驟:prepare 和 commit,中間再穿插寫入 binlog,這就是 "兩階段提交"。

而兩階段提交就是讓這兩個狀態保持邏輯上的一致。redolog 用於恢復主機故障時的未更新的物理數據,binlog 用於備份操作。兩者本身就是兩個獨立的個體,要想保持一致,就必須使用分佈式事務的解決方案來處理。

爲什麼需要兩階段提交呢?

在恢復數據時,redolog 狀態爲 commit 則說明 binlog 也成功,直接恢復數據;如果 redolog 是 prepare,則需要查詢對應的 binlog 事務是否成功,決定是回滾還是執行。

21、MySQL 怎麼知道 binlog 是完整的?

一個事務的 binlog 是有完整格式的:

22、什麼是 WAL 技術,有什麼優點?

WAL,中文全稱是 Write-Ahead Logging,它的關鍵點就是日誌先寫內存,再寫磁盤。MySQL 執行更新操作後,在真正把數據寫入到磁盤前,先記錄日誌

好處是不用每一次操作都實時把數據寫盤,就算 crash 後也可以通過 redo log 恢復,所以能夠實現快速響應 SQL 語句。

23、binlog 日誌的三種格式

binlog 日誌有三種格式

Statement 格式

每一條會修改數據的 SQL 都會記錄在 binlog 中

Row 格式

不記錄 SQL 語句上下文相關信息,僅保存哪條記錄被修改。

Mixed 格式

實際上就是 Statement 與 Row 的結合。一般的語句修改使用 statment 格式保存 binlog,如一些函數,statement 無法完成主從複製的操作,則採用 row 格式保存 binlog,MySQL 會根據執行的每一條具體的 SQL 語句來區分對待記錄的日誌形式。

24、redo log 日誌格式

redo log buffer (內存中) 是由首尾相連的四個文件組成的,它們分別是:ib_logfile_1、ib_logfile_2、ib_logfile_3、ib_logfile_4。

25、原本可以執行得很快的 SQL 語句,執行速度卻比預期的慢很多,原因是什麼?如何解決?

原因:從大到小可分爲四種情況

解決:

26、InnoDB 數據頁結構

一個數據頁大致劃分七個部分

數據相關

27、MySQL 是如何保證數據不丟失的?

28、誤刪數據怎麼辦?

DBA 的最核心的工作就是保證數據的完整性,先要做好預防,預防的話大概是通過這幾個點:

29、drop、truncate 和 delete 的區別

30、在 MySQL 中有兩個 kill 命令

kill 不掉的原因

31、如何理解 MySQL 的邊讀邊發

32、MySQL 的大表查詢爲什麼不會爆內存?

33、MySQL 臨時表的用法和特性

34、MySQL 存儲引擎介紹(InnoDB、MyISAM、MEMORY)

35、都說 InnoDB 好,那還要不要使用 MEMORY 引擎?

36、如果數據庫誤操作, 如何執行數據恢復?

數據庫在某個時候誤操作,就可以找到距離誤操作最近的時間節點的 bin log,重放到臨時數據庫裏,然後選擇誤刪的數據節點,恢復到線上數據庫。

主從備份相關

37、MySQL 是如何保證主備同步?

主備關係的建立:

MySQL 主備切換流程:

一個事務完整的同步過程:

38、什麼是主備延遲

主庫和備庫在執行同一個事務的時候出現時間差的問題,主要原因有:

39、爲什麼要有多線程複製策略?

40、MySQL 的並行策略有哪些?

41、MySQL 的一主一備和一主多從有什麼區別?

在一主一備的雙 M 架構裏,主備切換隻需要把客戶端流量切到備庫;而在一主多從架構裏,主備切換除了要把客戶端流量切到備庫外,還需要把從庫接到新主庫上。

42、主庫出問題如何解決?

43、MySQL 讀寫分離涉及到過期讀問題的幾種解決方案?

44、MySQL 的併發鏈接和併發查詢有什麼區別?

性能相關

45、短時間提高 MySQL 性能的方法

46、爲什麼 MySQL 自增主鍵 ID 不連續?

47、InnoDB 爲什麼要用自增 ID 作爲主鍵?

48、如何最快的複製一張表?

49、grant 和 flush privileges 語句

50、要不要使用分區表?

51、join 用法

52、MySQL 有哪些自增 ID?各自場景是什麼?

53、Xid 在 MySQL 內部是怎麼生成的呢?

MySQL 內部維護了一個全局變量 global_query_id,每次執行語句(包括 select 語句)的時候將它賦值給 Query_id,然後給這個變量加 1。如果當前語句是這個事務執行的第一條語句,那麼 MySQL 還會同時把 Query_id 賦值給這個事務的 Xid。

而 global_query_id 是一個純內存變量,重啓之後就清零了。所以你就知道了,在同一個數據庫實例中,不同事務的 Xid 也是有可能相同的。但是 MySQL 重啓之後會重新生成新的 binlog 文件,這就保證了,同一個 binlog 文件裏,Xid 一定是惟一的。

鎖相關

54、說一下 MySQL 的鎖

55、什麼是幻讀?

值在同一個事務中,存在前後兩次查詢同一個範圍的數據,第二次看到了第一次沒有查詢到的數據。

幻讀出現的場景:

幻讀帶來的問題:

解決:

其它爲什麼系列

56、爲什麼 MySQL 會抖一下?

57、爲什麼刪除了表,表文件的大小還是沒變?

58、count(*) 實現方式以及各種 count 對比

59、orderby 排序內部原理

60、如何高效的使用 MySQL 顯式隨機消息

參考:

今天的嘮嗑就到這裏了。

我是小賀,我們下期再見。

你好,我是 herongwei,一個精神小夥 & 鵝廠程序猿,熱愛編程,熱愛生活,熱愛分享,在平凡的人生中追求一點不平凡,歡迎關注,一起加油,點擊下方名片,瞭解更多。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/-SqqKmhZcOlQxM-rHiIpKg