MySQL綜合面試題
-
請寫出什麼是事務?
事務是一組不可分割的 DML 語句,事務處理可以用來維護資料庫的完整性,保證一組 SQL 語句要麼全部執行成功,要麼全部不執行,只有 InnoDB 儲存引擎才支援事務 。
-
事務的特性是什麼?
A(Atomicity):事務具有原子性,一個事務不可分割,要麼全部執行成功,要麼全部執行失敗。 C(Consistency):事務具有一致性,事務執行前後,要符合原始資料庫的預設,資料庫的完整性沒有被破壞。 I(Isolation):事務具有隔離性,事務之間內部互不干擾,一個事務在提交之前,對於其他事務是透明的。 D(Durability):事務具有永續性,一旦事務提交存入資料庫,會永久儲存。
-
MySQL事務的隔離級別有幾種,分別是什麼?
MySQL 事務的隔離級別有四種, # RU(Read-Uncommited):未提交讀,所有事務都可以看到其他事務未提交的修改 # RC(Read-Commited):提交讀,一個事務只能看到其他事務已經提交的修改 # RR(Repeatable-Read):可重複讀,確保同一個事務的多個例項,在併發讀取資料時,看到相同的資料行 # Serializable:可序列化,事務序列執行
-
什麼是髒讀,幻讀,不可重複讀?
# 髒讀:RU級別 會出現,執行事務時修改記錄並未提交,另一個事務讀取該記錄,但最終資料回滾,查詢到的資料,就是髒資料 # 幻讀:RU/RC/RR級別 會出現,刪除所有表資料,刪除的同時有人插入資料,表中仍然有記錄 # 不可重複讀:RU/RC級別 會出現,開啟一個事務,查詢某一條資料,另外一個事務修改這一行資料提交,再次查詢這一條資料結果不同
-
如何解決髒讀,幻讀,不可重複讀的問題?
根據具體環境使用不同的隔離級別??
-
MySQL中索引的分類有幾種?分別是什麼?
BTree RTree(MySQL 中很少使用) Hash(Memory 儲存引擎支援) Fulltext(MyISAM 儲存引擎支援)
-
請寫出如下慢查詢SQL語句的排查過程?及解決辦法
Select * from world.city where population>100; # 全表掃描,並且讀取每行的所有資料 # 解決辦法: # 給 id 建立主鍵索引,給 population 建立輔助索引,查詢的時候先掃描輔助索引表,再掃描主鍵(聚集)索引表,查詢速度會快一些
-
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 時使用表級鎖,併發量較少
-
資料型別,varchar和char的區別?
vachar 是變長字串型別,字串沒有佔滿,不會用空格字元填充 char 是定長字串型別,字串沒有佔滿,用空格字元填充
-
Int 型別的範圍是多少?
2^31 ———— 2^31 - 1
-
請寫出以下鎖的功能?
共享鎖:又稱讀鎖,若事務對資料行讀取、加了讀鎖,其他事務只能對該資料行加讀鎖,不能加寫鎖 排它鎖:又稱寫鎖,若事務對資料行修改、加了寫鎖,其他事務不能對該資料行加任何鎖 樂觀鎖:當要對資料庫中的一條資料進行修改的時候,不會加鎖,提交時會檢測是否與其他事務有衝突 悲觀鎖:當要對資料庫中的一條資料進行修改的時候,為了避免同時被其他人修改,最好的辦法就是直接對該資料進行加鎖以防止併發
-
請寫出innodb儲存引擎鎖粒度是什麼?
InnoDB 儲存引擎鎖的粒度是 行級鎖
-
請寫出,delete、drop、truncate的區別
Delete 刪除表資料時,會一條一條記錄的清空,表結構還在 Drop 刪除整個表,表結構也會刪除 Truncate 刪除表資料時,釋放儲存表資料所用的資料頁來刪除資料,在事務日誌中只記錄頁的釋放,表結構還在
-
如何使用update代替delete?
另外新增一個 欄位型別,例如: ALTER TABLE students ADD COLUMN status enum(1,0) default 1; 如果學生在讀,欄位賦值為 1, 如果學生輟學,可以將欄位賦值為 0,
-
請寫出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 位置點)
-
請寫出半同步複製和延時從庫的原理?
半同步複製:I/O 執行緒為了主庫與從庫的資料統一,會阻止主庫的資料寫入,當資料寫入超時,自動切換為主從複製 延時複製:I/O 執行緒將 Binlog 事件寫入 TCP 快取再寫入 Relay-log,此過程不延時 SQL 執行緒讀取 Relay-log 中的事件延時執行
-
請寫出MySQL主從複製的相關檔案和執行緒名
主庫檔案: binlog 從庫檔案: relay-log master.info relaylog.info 主庫執行緒: Dump 執行緒 從庫執行緒: I/O 執行緒 SQL 執行緒
-
MySQL如何保證資料的安全性和一致性?
Redolog 保證資料庫崩潰也可以使在記憶體中修改後,未落入到磁碟的資料恢復,保證資料安全性 Undolog 為每一個事務賦予一個唯一的標識 trxid,記錄著該事務是否 Commit,保證資料一致性
-
請寫出MySQL二進位制日誌的工作模式有幾種?區別是什麼?
語句模式:記錄 SQL語句,易讀性好,佔用磁碟空間較小 行模式:記錄變化過程,不易讀,需要使用選項檢視,佔用磁碟空間較大 混合模式:前兩種混合使用
-
請寫出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:備份觸發器
-
請寫出如何擷取二進位制日誌和中繼日誌?
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
-
如何在資料庫中只備份單表?
# 備份 shop 庫下的 product 表, mysqldump shop product > /tmp/product.sql # 當不加引數時命令後面跟的是庫名,庫的後面全都是必須是庫下面的表名
-
如何在已執行在生產環境中的叢集,新增一臺從庫?
新準備一臺伺服器,安裝並初始化 MySQL 在主庫上建立一個專用複製使用者 在主庫上獲取 Binlog-file 和 Binlog-pos 值,並將全部資料匯出傳送給從庫 從庫匯入全部資料 從庫執行 change master to 命令配置連線主庫資訊(主庫IP,user,password,file,pos) 從庫執行 start slave;
-
請寫出MHA的工作原理?
使用一個虛擬IP地址,繫結在主庫節點上, 主庫節點服務出現故障,虛擬IP地址立刻漂移到從庫的伺服器上
-
在阿里雲中如何使用MHA?
買它
-
請寫出MySQL 主從複製IO執行緒報錯的排查思路?
# 檢查網路 PING 一下 # 檢查埠 # 使用 myql 命令,使用複製使用者連線一下主庫 # 檢查配置檔案 server_id # 檢查主庫從庫的 UUID # 防火牆
-
請寫出MySQL 主從複製SQL執行緒報錯的解決辦法?
# 重新匯入主庫全部資料,再做同步
-
如何設定MySQL的 session變數及全域性變數?
設定全域性變數: 1)修改 my.cnf 2)mysql> SET GLOBAL AUTOCOMMIT=1; 設定會話變數: 1)mysql> SET SESSION AUTOCOMMIT=1;
-
什麼是水平分表?什麼是垂直分表?表真的分了麼分成什麼樣的了?
水平分表:講一個表中的資料記錄,拆分到多個表中,所有的表結構都相同,意義就是用來分擔更多的併發,擴充套件更多的容量 垂直分表:將一個表的所有欄位分組拆分,重新構成多個表,可以用外來鍵建立表之間的關聯
-
請寫出,你在企業中,MySQL遇到資料不一致問題時,是如何解決的?
檢查事務的隔離級別??
-
什麼是儲存過程?用什麼來呼叫?
儲存過程類似於一個函式,需要使用 CALL 主動呼叫
-
什麼是觸發器?觸發器的作用是什麼?
由事件來觸發,當對一個表進行操作(INSERT,DELETE,UPDATE)時就會啟用它執行
-
主鍵和唯一鍵還有候選鍵有什麼區別?
主鍵和唯一鍵區別:主鍵是非空的 候選鍵:隨意一個候選鍵都可以作為主鍵
-
AUTO_INCREMENT 可不可以設定最大值,可以的話怎麼設定
不可以
-
查詢時運算子都有哪些
< > = != <> >= <= % _ && || AND OR NOT IN
-
列出我們用過的函式(最少4個)
COUNT DISTINCT SUM MAX MIN
-
怎麼檢視一個表的字元型別(最少兩種方法)
SHOW CREATE TABLE `table_name`; DESC `table_name`;
-
B+tree索引對比Btree索引在哪裡進行了優化
B+tree 在葉子節點上添加了指標,指向相鄰的葉子節點
-
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. 當伺服器出現問題,你該如何入手排查問題,排查思路是什麼?
```
略
```