這15道MySQL面試題,解決了90%的面試官

退役的bug程式設計師發表於2020-10-29

前言:

MySQL 是我們開發常常接觸的資料庫,在很多小夥伴找工作的時候都會被 MySQL 的一些理論知識給嚇到。畢竟 MySQL涉及到資料儲存、鎖、磁碟尋道、分頁等作業系統概念,而且網際網路對 MySQL 的注重程度是不言而喻的,所以要加緊對 MySQL 的研究。
在這裡插入圖片描述

1.資料庫三正規化是什麼?

另外本人整理了20年面試題大全,包含spring、併發、資料庫、Redis、分散式、dubbo、JVM、微服務等方面總結,下圖是部分截圖,需要的話點這裡點這裡,暗號CSDN。

在這裡插入圖片描述

  1. 第一正規化(1NF):欄位具有原子性,不可再分。(所有關係型資料庫系統都滿足第一正規化資料庫表中的欄位都是單一屬性的,不可再分)
  2. 第二正規化(2NF)是在第一正規化(1NF)的基礎上建立起來的,即滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。要求資料庫表中的每個例項或行必須可以被惟一地區分。通常需要為表加上一個列,以儲存各個例項的惟一標識。這個惟一屬性列被稱為主關鍵字或主鍵。
  3. 滿足第三正規化(3NF)必須先滿足第二正規化(2NF)。簡而言之,第三正規化(3NF)要求一個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊。 >所以第三正規化具有如下特徵: >>1. 每一列只有一個值 >>2. 每一行都能區分。 >>3. 每一個表都不包含其他表已經包含的非主關鍵字資訊。

2.有哪些資料庫優化方面的經驗?

在這裡插入圖片描述

  1. 用PreparedStatement, 一般來說比Statement效能高:一個sql 發給伺服器去執行,涉及步驟:語法檢查、語義分析, 編譯,快取。
  2. 有外來鍵約束會影響插入和刪除效能,如果程式能夠保證資料的完整性,那在設計資料庫時就去掉外來鍵。
  3. 表中允許適當冗餘,譬如,主題帖的回覆數量和最後回覆時間等
  4. UNION ALL 要比UNION快很多,所以,如果可以確認合併的兩個結果集中不包含重複資料且不需要排序時的話,那麼就使用UNION ALL。 >>UNION和UNION ALL關鍵字都是將兩個結果集合併為一個,但這兩者從使用和效率上來說都有所不同。 >1. 對重複結果的處理:UNION在進行錶連結後會篩選掉重複的記錄,Union All不會去除重複記錄。 >2. 對排序的處理:Union將會按照欄位的順序進行排序;UNION ALL只是簡單的將兩個結果合併後就返回。

3.請簡述常用的索引有哪些種類?

  1. 普通索引: 即針對資料庫表建立索引
  2. 唯一索引: 與普通索引類似,不同的就是:MySQL資料庫索引列的值必須唯一,但允許有空值
  3. 主鍵索引: 它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時建立主鍵索引
  4. 組合索引: 為了進一步榨取MySQL的效率,就要考慮建立組合索引。即將資料庫表中的多個欄位聯合起來作為一個組合索引。

4.以及在mysql資料庫中索引的工作機制是什麼?

資料庫索引,是資料庫管理系統中一個排序的資料結構,以協助快速查詢、更新資料庫表中資料。索引的實現通常使用B樹及其變種B+樹

5.MySQL的基礎操作命令:

  1. MySQL 是否處於執行狀態:Debian 上執行命令 service mysql status,在RedHat 上執行命令 service mysqld status
  2. 開啟或停止 MySQL 服務 :執行命令 service mysqld start 開啟服務;執行命令 service mysqld stop 停止服務
  3. Shell 登入 MySQL: 執行命令 mysql -u root -p
  4. 列出所有資料庫:執行命令 show databases;
  5. 切換到某個資料庫並在上面工作:執行命令 use databasename; 進入名為 databasename 的資料庫
  6. 列出某個資料庫內所有表: show tables;
  7. 獲取表內所有 Field 物件的名稱和型別 :describe table_name;

6.mysql的複製原理以及流程。

Mysql內建的複製功能是構建大型,高效能應用程式的基礎。將Mysql的資料分佈到多個系統上去,這種分佈的機制,是通過將Mysql的某一臺主機的資料複製到其它主機(slaves)上,並重新執行一遍來實現的。 * 複製過程中一個伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。主伺服器將更新寫入二進位制日誌檔案,並維護檔案的一個索引以跟蹤日誌迴圈。這些日誌可以記錄傳送到從伺服器的更新。 當一個從伺服器連線主伺服器時,它通知主伺服器在日誌中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,然後封鎖並等待主伺服器通知新的更新。

過程如下 :

  1. 主伺服器把更新記錄到二進位制日誌檔案中。
  2. 從伺服器把主伺服器的二進位制日誌拷貝到自己的中繼日誌(replay log)中。
  3. 從伺服器重做中繼日誌中的時間,把更新應用到自己的資料庫上。

7.mysql支援的複製型別?

  1. 基於語句的複製: 在主伺服器上執行的SQL語句,在從伺服器上執行同樣的語句。MySQL預設採用基於語句的複製,效率比較高。 一旦發現沒法精確複製時,會自動選著基於行的複製。
  2. 基於行的複製:把改變的內容複製過去,而不是把命令在從伺服器上執行一遍. 從mysql5.0開始支援
  3. 混合型別的複製: 預設採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製。

8.mysql中myisam與innodb的區別?

  1. 事務支援 > MyISAM:強調的是效能,每次查詢具有原子性,其執行數度比InnoDB型別更快,但是不提供事務支援。 > InnoDB:提供事務支援事務,外部鍵等高階資料庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。
  2. InnoDB支援行級鎖,而MyISAM支援表級鎖. >> 使用者在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以後的表滿足insert併發的情況下,可以在表的尾部插入新的資料。
  3. InnoDB支援MVCC, 而MyISAM不支援
  4. InnoDB支援外來鍵,而MyISAM不支援
  5. 表主鍵 > MyISAM:允許沒有任何索引和主鍵的表存在,索引都是儲存行的地址。 > InnoDB:如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6位元組的主鍵(使用者不可見),資料是主索引的一部分,附加索引儲存的是主索引的值。
  6. InnoDB不支援全文索引,而MyISAM支援。
  7. 可移植性、備份及恢復 > MyISAM:資料是以檔案的形式儲存,所以在跨平臺的資料轉移中會很方便。在備份和恢復時可單獨針對某個表進行操作。 > InnoDB:免費的方案可以是拷貝資料檔案、備份 binlog,或者用 mysqldump,在資料量達到幾十G的時候就相對痛苦了
  8. 儲存結構 > MyISAM:每個MyISAM在磁碟上儲存成三個檔案。第一個檔案的名字以表的名字開始,副檔名指出檔案型別。.frm檔案儲存表定義。資料檔案的副檔名為.MYD (MYData)。索引檔案的副檔名是.MYI (MYIndex)。 > InnoDB:所有的表都儲存在同一個資料檔案中(也可能是多個檔案,或者是獨立的表空間檔案),InnoDB表的大小隻受限於作業系統檔案的大小,一般為2GB。

9.mysql中varchar與char的區別以及varchar(50)中的50代表的涵義?

  1. varchar與char的區別: char是一種固定長度的型別,varchar則是一種可變長度的型別.
  2. varchar(50)中50的涵義 : 最多存放50個位元組
  3. int(20)中20的涵義: int(M)中的M indicates the maximum display width (最大顯示寬度)for integer types. The maximum legal display width is 255.

10.MySQL中InnoDB支援的四種事務隔離級別名稱,以及逐級之間的區別?

  1. Read Uncommitted(讀取未提交內容) >> 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(Dirty Read)。
  2. Read Committed(讀取提交內容) >> 這是大多數資料庫系統的預設隔離級別(但不是MySQL預設的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別也支援所謂的不可重複讀(Nonrepeatable Read),因為同一事務的其他例項在該例項處理其間可能會有新的commit,所以同一select可能返回不同結果。
  3. Repeatable Read(可重讀) >> 這是MySQL的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過理論上,這會導致另一個棘手的問題:幻讀(Phantom Read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另一個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的“幻影” 行。InnoDB和Falcon儲存引擎通過多版本併發控制(MVCC,Multiversion Concurrency Control 間隙鎖)機制解決了該問題。注:其實多版本只是解決不可重複讀問題,而加上間隙鎖(也就是它這裡所謂的併發控制)才解決了幻讀問題。
  4. Serializable(可序列化) >> 這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。
    隔離級別髒讀(Dirty Read)不可重複讀(NonRepeatable Read)幻讀(Phantom Read)
    未提交讀(Read uncommitted)可能可能可能
    已提交讀(Read committed)不可能可能可能
    可重複讀(Repeatable read)不可能不可能可能
    可序列化(SERIALIZABLE)不可能不可能不可能

11.表中有大欄位X(例如:text型別),且欄位X不會經常更新,以讀為為主,將該欄位拆成子表好處是什麼?

如果欄位裡面有大欄位(text,blob)型別的,而且這些欄位的訪問並不多,這時候放在一起就變成缺點了。 MYSQL資料庫的記錄儲存是按行儲存的,資料塊大小又是固定的(16K),每條記錄越小,相同的塊儲存的記錄就越多。此時應該把大欄位拆走,這樣應付大部分小欄位的查詢時,就能提高效率。當需要查詢大欄位時,此時的關聯查詢是不可避免的,但也是值得的。拆分開後,對欄位的UPDAE就要UPDATE多個表了

12.MySQL中InnoDB引擎的行鎖是通過加在什麼上完成(或稱實現)的?

InnoDB行鎖是通過給索引上的索引項加鎖來實現的,這一點MySQL與Oracle不同,後者是通過在資料塊中對相應資料行加鎖來實現的。InnoDB這種行鎖實現特點意味著:只有通過索引條件檢索資料,InnoDB才使用行級鎖,否則,InnoDB將使用表鎖!

13.若一張表中只有一個欄位VARCHAR(N)型別,utf8編碼,則N最大值為多少(精確到數量級即可)?

由於utf8的每個字元最多佔用3個位元組。而MySQL定義行的長度不能超過65535,因此N的最大值計算方法為:(65535-1-2)/3。減去1的原因是實際儲存從第二個位元組開始,減去2的原因是因為要在列表長度儲存實際的字元長度,除以3是因為utf8限制:每個字元最多佔用3個位元組。

14. [SELECT *] 和[SELECT 全部欄位]的2種寫法有何優缺點?

  1. 前者要解析資料字典,後者不需要
  2. 結果輸出順序,前者與建表列順序相同,後者按指定欄位順序。
  3. 表欄位改名,前者不需要修改,後者需要改
  4. 後者可以建立索引進行優化,前者無法優化
  5. 後者的可讀性比前者要高

15.HAVNG 子句 和 WHERE的異同點?

  1. 語法上:where 用表中列名,having用select結果別名
  2. 影響結果範圍:where從表讀出資料的行數,having返回客戶端的行數
  3. 索引:where 可以使用索引,having不能使用索引,只能在臨時結果集操作
  4. where後面不能使用聚集函式,having是專門使用聚集函式的。

最後:

針對最近很多人都在面試,我這邊也整理了相當多的面試專題資料,也有其他大廠的面經。希望可以幫助到大家。

下面的面試題答案都整理成文件筆記。也還整理了一些面試資料&最新2020收集的一些大廠的面試真題(都整理成文件,小部分截圖),有需要的可以點選進入暗號CSDN

在這裡插入圖片描述

在這裡插入圖片描述

相關文章