1. 程式人生 > 實用技巧 >MySQL綜合面試題

MySQL綜合面試題

  1. 請寫出什麼是事務?

    事務是一組不可分割的 DML 語句,事務處理可以用來維護資料庫的完整性,保證一組 SQL 語句要麼全部執行成功,要麼全部不執行,只有 InnoDB 儲存引擎才支援事務 。 
    
  2. 事務的特性是什麼?

    A(Atomicity):事務具有原子性,一個事務不可分割,要麼全部執行成功,要麼全部執行失敗。
    C(Consistency):事務具有一致性,事務執行前後,要符合原始資料庫的預設,資料庫的完整性沒有被破壞。
    I(Isolation):事務具有隔離性,事務之間內部互不干擾,一個事務在提交之前,對於其他事務是透明的。
    D(Durability):事務具有永續性,一旦事務提交存入資料庫,會永久儲存。
    
  3. MySQL事務的隔離級別有幾種,分別是什麼?

    MySQL 事務的隔離級別有四種,
    # RU(Read-Uncommited):未提交讀,所有事務都可以看到其他事務未提交的修改
    # RC(Read-Commited):提交讀,一個事務只能看到其他事務已經提交的修改
    # RR(Repeatable-Read):可重複讀,確保同一個事務的多個例項,在併發讀取資料時,看到相同的資料行
    # Serializable:可序列化,事務序列執行
    
  4. 什麼是髒讀,幻讀,不可重複讀?

    # 髒讀:RU級別 會出現,執行事務時修改記錄並未提交,另一個事務讀取該記錄,但最終資料回滾,查詢到的資料,就是髒資料
    # 幻讀:RU/RC/RR級別 會出現,刪除所有表資料,刪除的同時有人插入資料,表中仍然有記錄
    # 不可重複讀:RU/RC級別 會出現,開啟一個事務,查詢某一條資料,另外一個事務修改這一行資料提交,再次查詢這一條資料結果不同
    
  5. 如何解決髒讀,幻讀,不可重複讀的問題?

    根據具體環境使用不同的隔離級別??
    
  6. MySQL中索引的分類有幾種?分別是什麼?

    BTree
    RTree(MySQL 中很少使用)
    Hash(Memory 儲存引擎支援)
    Fulltext(MyISAM 儲存引擎支援)
    
  7. 請寫出如下慢查詢SQL語句的排查過程?及解決辦法

    Select * from world.city where population>100;
    
    # 全表掃描,並且讀取每行的所有資料
    # 解決辦法:
    # 給 id 建立主鍵索引,給 population 建立輔助索引,查詢的時候先掃描輔助索引表,再掃描主鍵(聚集)索引表,查詢速度會快一些
    
  8. MySQL 儲存引擎,InnoDB 與MyISAM 的區別?

    InooDB 儲存引擎:
    1)支援事務
    2)行級鎖
    3)查詢速度相對 MyISAM 儲存引擎較慢(使用行級鎖查詢開銷大) 
    4)不支援 fulltext 資料型別
    5)不儲存表的具體行數,使用 Count 函式需要全表掃描
    6)物理檔案構成: .frm(表結構) .ibd(表索引 & 表資料)
    7)支援外來鍵
    8)對於設定 AUTO_INCREMENT 的列,必須要建立索引,即使是聯合索引,也必須置於第一列 
    9)UPDATE 時使用行級鎖,併發量相對較大,可以應對大量的 INSERT 或者 UPDATE
    
    
    MyISAM 儲存引擎:
    1)不支援事務
    2)表級鎖
    3)查詢速度相對 InnoDB 儲存引擎較快(使用表鎖查詢開銷小)
    4)支援 fulltext 資料型別
    5)儲存表的具體行數,使用 Count 函式不需要全表掃描 
    6)物理檔案構成: .frm(表結構) .MYI(表索引) .MYD(表資料)
    7)不支援外來鍵
    8)對於設定 AUTO_INCREMENT 的列,必須要建立索引,但若是聯合索引,不要求必須置於第一列
    9)UPDATE 時使用表級鎖,併發量較少
    
  9. 資料型別,varchar和char的區別?

    vachar 是變長字串型別,字串沒有佔滿,不會用空格字元填充
    char 是定長字串型別,字串沒有佔滿,用空格字元填充
    
    
  10. Int 型別的範圍是多少?

    2^31  ————  2^31 - 1
    
  11. 請寫出以下鎖的功能?

    共享鎖:又稱讀鎖,若事務對資料行讀取、加了讀鎖,其他事務只能對該資料行加讀鎖,不能加寫鎖
    排它鎖:又稱寫鎖,若事務對資料行修改、加了寫鎖,其他事務不能對該資料行加任何鎖
    樂觀鎖:當要對資料庫中的一條資料進行修改的時候,不會加鎖,提交時會檢測是否與其他事務有衝突
    悲觀鎖:當要對資料庫中的一條資料進行修改的時候,為了避免同時被其他人修改,最好的辦法就是直接對該資料進行加鎖以防止併發
    
  12. 請寫出innodb儲存引擎鎖粒度是什麼?

    InnoDB 儲存引擎鎖的粒度是 行級鎖 
    
  13. 請寫出,delete、drop、truncate的區別

    Delete 刪除表資料時,會一條一條記錄的清空,表結構還在
    Drop 刪除整個表,表結構也會刪除
    Truncate 刪除表資料時,釋放儲存表資料所用的資料頁來刪除資料,在事務日誌中只記錄頁的釋放,表結構還在 
    
  14. 如何使用update代替delete?

    另外新增一個 欄位型別,例如:
    ALTER TABLE students ADD COLUMN status enum(1,0) default 1;
    
    如果學生在讀,欄位賦值為 1,
    如果學生輟學,可以將欄位賦值為 0, 
    
  15. 請寫出MySQL主從複製原理,畫圖 + 文字描述

    主庫配置:
    #  主庫配置 server_id ,開啟 bin-log (/etc/my.cnf)
    #  主庫建立授權主從複製使用者(grant replication slave)
    #  獲取主庫的 binlog 資訊(file,position)
    #  匯出主庫資料(mysqldump -uroot -p -A -R --triggers --master-data=2 --single-transaction > /tmp/full.sql)
    
    從庫配置:
    #  從庫配置 server_id 
    #  確認使用主庫的主從複製使用者可以連線主庫
    #  匯入主庫資料(mysql < full.sql)
    #  配置主從(change master to),需要 Master節點 IP,使用者,埠,binlog-file,binlog-pos
    #  binlog 配置資訊可以從 full.sql 中 22 行獲得
    
    工作原理:
    #  1. Start slave 之後,從庫開啟 IO執行緒 和 SQL執行緒
    #  2. 主庫開啟 Dump執行緒
    #  3. IO執行緒 向 Dump執行緒 發起詢問,詢問是否有新的資料
    #  4. Dump執行緒 被詢問,查詢是否有新資料,若有返回給 IO執行緒
    #  5. IO執行緒 拿到資料,寫入TCP快取
    #  6. TCP快取拿到資料,寫入relay-log,並返回給 IO執行緒一個 ACK報文
    #  7. IO執行緒 收到 ACK報文,會記錄當前位置到 master.info(binlog 位置點)
    #  8. SQL執行緒 會主動讀取 relay-log,執行主庫執行的sql語句
    #  9. 執行後,將執行到的位置點,記錄到 relay-log.info(relay-log 位置點)
    
  16. 請寫出半同步複製和延時從庫的原理?

    半同步複製:I/O 執行緒為了主庫與從庫的資料統一,會阻止主庫的資料寫入,當資料寫入超時,自動切換為主從複製
    
    延時複製:I/O 執行緒將 Binlog 事件寫入 TCP 快取再寫入 Relay-log,此過程不延時
    SQL 執行緒讀取 Relay-log 中的事件延時執行
    
  17. 請寫出MySQL主從複製的相關檔案和執行緒名

    主庫檔案:
    binlog
    
    從庫檔案:
    relay-log
    master.info
    relaylog.info
    
    主庫執行緒:
    Dump 執行緒
    
    從庫執行緒:
    I/O 執行緒
    SQL 執行緒
    
  18. MySQL如何保證資料的安全性和一致性?

    Redolog 保證資料庫崩潰也可以使在記憶體中修改後,未落入到磁碟的資料恢復,保證資料安全性
    Undolog 為每一個事務賦予一個唯一的標識 trxid,記錄著該事務是否 Commit,保證資料一致性
    
  19. 請寫出MySQL二進位制日誌的工作模式有幾種?區別是什麼?

    語句模式:記錄 SQL語句,易讀性好,佔用磁碟空間較小
    
    行模式:記錄變化過程,不易讀,需要使用選項檢視,佔用磁碟空間較大
    
    混合模式:前兩種混合使用
    
  20. 請寫出mysqldump常用引數及含義

    -u:使用者
    -p:密碼
    -h:指定 IP
    -S:指定 socket 檔案
    -A:全庫備份
    -B:指定庫
    -F:指定備份時,重新整理 binlog
    --master-data:指定備份時,change master to 語句是否加註釋
    	1)等於2:記錄 binlog 資訊,並註釋(日常備份)
    	2)等於1:記錄 binlog 資訊,不註釋(擴充套件從庫)
    	0)等於0:不記錄 binlog 資訊
    --single-transaction:建立一個全庫資料的一致性快照,開啟一個單一事務 
    -d:只備份表結構
    -t:只備份資料
    -R:備份儲存過程和函式
    --triggers:備份觸發器
    
  21. 請寫出如何擷取二進位制日誌和中繼日誌?

    mysqlbinlog -d business --start-position=825 --stop-position=1405 mysql-bin.000005 > /tmp/additional.sql
    
    mysqlbinlog -d business --start-position=825 --stop-position=1405 relay-log.000005 > /tmp/additional.sql
    
  22. 如何在資料庫中只備份單表?

    # 備份 shop 庫下的 product 表,
    mysqldump shop product > /tmp/product.sql
    # 當不加引數時命令後面跟的是庫名,庫的後面全都是必須是庫下面的表名
    
  23. 如何在已執行在生產環境中的叢集,新增一臺從庫?

    新準備一臺伺服器,安裝並初始化 MySQL
    在主庫上建立一個專用複製使用者
    在主庫上獲取 Binlog-file 和 Binlog-pos 值,並將全部資料匯出傳送給從庫
    從庫匯入全部資料
    從庫執行 change master to 命令配置連線主庫資訊(主庫IP,user,password,file,pos)
    從庫執行 start slave;
    
  24. 請寫出MHA的工作原理?

    使用一個虛擬IP地址,繫結在主庫節點上,
    主庫節點服務出現故障,虛擬IP地址立刻漂移到從庫的伺服器上
    
  25. 在阿里雲中如何使用MHA?

    買它
    
  26. 請寫出MySQL 主從複製IO執行緒報錯的排查思路?

    # 檢查網路 PING 一下
    # 檢查埠
    # 使用 myql 命令,使用複製使用者連線一下主庫
    # 檢查配置檔案 server_id
    # 檢查主庫從庫的 UUID
    # 防火牆
    
  27. 請寫出MySQL 主從複製SQL執行緒報錯的解決辦法?

    # 重新匯入主庫全部資料,再做同步
    
  28. 如何設定MySQL的 session變數及全域性變數?

    設定全域性變數:
    1)修改 my.cnf 
    2)mysql> SET GLOBAL AUTOCOMMIT=1;
    
    設定會話變數:
    1)mysql> SET SESSION AUTOCOMMIT=1;
    
  29. 什麼是水平分表?什麼是垂直分表?表真的分了麼分成什麼樣的了?

    水平分表:講一個表中的資料記錄,拆分到多個表中,所有的表結構都相同,意義就是用來分擔更多的併發,擴充套件更多的容量
    
    垂直分表:將一個表的所有欄位分組拆分,重新構成多個表,可以用外來鍵建立表之間的關聯
    
  30. 請寫出,你在企業中,MySQL遇到資料不一致問題時,是如何解決的?

    檢查事務的隔離級別??
    
  31. 什麼是儲存過程?用什麼來呼叫?

    儲存過程類似於一個函式,需要使用 CALL 主動呼叫
    
  32. 什麼是觸發器?觸發器的作用是什麼?

    由事件來觸發,當對一個表進行操作(INSERT,DELETE,UPDATE)時就會啟用它執行
    
  33. 主鍵和唯一鍵還有候選鍵有什麼區別?

    主鍵和唯一鍵區別:主鍵是非空的
    候選鍵:隨意一個候選鍵都可以作為主鍵
    
  34. AUTO_INCREMENT 可不可以設定最大值,可以的話怎麼設定

    不可以
    
  35. 查詢時運算子都有哪些

    <
    >
    =
    !=
    <>
    >=
    <=
    %
    _
    &&
    ||
    AND
    OR
    NOT
    IN 
    
  36. 列出我們用過的函式(最少4個)

    COUNT
    DISTINCT
    SUM
    MAX
    MIN
    
  37. 怎麼檢視一個表的字元型別(最少兩種方法)

    SHOW CREATE TABLE `table_name`;
    DESC `table_name`;
    
  38. B+tree索引對比Btree索引在哪裡進行了優化

    B+tree 在葉子節點上添加了指標,指向相鄰的葉子節點
    
  39. Mysql 優化該怎麼做?

    # 1.選擇合適的儲存引擎
    # 2.選擇合適的欄位建立索引
    # 3.選擇合適的資料型別(用 varchar 代替 char)
    # 4.表資料過多時,需要對錶資料拆分
    

40. SQL語言包括哪幾部分?每部分都有哪些命令?

 ```
 DDL(Data Defination Language):CREATE DROP ALTER
 DML(Data Manipulation Language):UPDATE INSERT DELETE 
 DQL(Data Query Language):SELECT DESC
 DCL(Data Control Language):GRANT REVOKE BEGIN COMMIT ROLLBACK
 ```

41. 請說明主鍵、外來鍵和索引的區別?

 ```
 主鍵: 一行記錄的唯一標識
 外來鍵: 一個表和另一個表資料之間關聯,在主表中建立外來鍵關聯另一個表,外來鍵必須是唯一鍵,但不一定是主鍵
 索引: 包括主鍵索引,唯一鍵索引,普通索引
 ```

42. 索引有哪些優缺點?

 ```
 優點:提升了查詢速度
 缺點:佔用磁碟空間
 ```

 ```
 優點
 1、通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。
 2、可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。 
 3、可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。 
 4、在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。
 5、通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能
 缺點
 1、建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。 
 2、索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果要建立 聚簇索引,那麼需要的空間就會更大。 
 3、當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。
 ```

 

43. 索引有哪幾種類型?

 ```
 主鍵索引
 唯一鍵索引
 普通索引
 全文索引
 ```

44. 請寫出給table表id欄位新增索引和刪除索引的命令?

 ```
 ALTER TABLE table ADD PRIMARY KEY(id);
 ALTER TABLE table DROP PRIMARY KEY;
 ```

45. 一般建立索引你會考慮到那些?

 ```
 建立主鍵索引:
 該欄位的值是否都是唯一的
 該欄位的值是否都是非空的
 只能建立一個主鍵索引
 
 建立唯一鍵索引:
 該欄位的值是否都是唯一的
 
 建立普通索引或聯合索引:
 該欄位的值中重複值數量
 該欄位的值是否經常用來查詢
 ```

46. 什麼是臨時表

 ```
 臨時表只在當前連線可見,當關閉連線時,MySQL 會自動刪除表並釋放所有空間
 1、union查詢
 2、對於檢視的操作,比如使用一些TEMPTABLE演算法、union或aggregation
 3、子查詢 
 4、join 包括not in、exist等
 5、查詢產生的派生表 
 6、複雜的group by 和 order by
 7、Insert select 同一個表,mysql會產生一個臨時表快取select的行
 8、多個表更新
 9、GROUP_CONCAT() 或者 COUNT(DISTINCT) 語句
 ```

47. 資料庫分幾種?分別都有哪些?

 ```mysql
 關係型資料庫:
 MySQL 
 Oracle 
 非關係型資料庫:
 Memcached
 Redis
 ```

48. 什麼情況下索引會不生效

 ```
 1)查詢條件中沒有索引
 2)隱式轉換,如 char 型別比較 Int 型別
 3)聯合索引的順序不符合條件時
 4)索引損壞
 5)在字串前使用 "%" 或者 "_" 模糊匹配時
 6)查詢條件欄位參與了運算
 7)查詢的結果佔總資料的 15% 以上
 ```

49. 一條sql語句執行時間過長你會優化?

 ```
 # 使用 explain 分析 SQL語句,是否使用索引
 # 使用 union 聯合查詢 代替子查詢
 # 使用 left join 時,用 小表 left join 大表
 ```

50. 你們資料庫不支援emoji表情,你該怎麼辦?怎麼操作?

 ```bash
 將資料庫字符集,改成 utf8mb4
 ```

51. 當伺服器出現問題,你該如何入手排查問題,排查思路是什麼?

 ```
 略
 ```