# 常見的MySQL面試題有哪些
MySQL作為最流行的開源關系型數據庫之一,是后端開發和數據庫崗位面試的重點考察領域。本文將系統梳理高頻MySQL面試題,涵蓋基礎概念、索引優化、事務機制、鎖機制、性能調優等核心知識點,幫助求職者全面備戰。
---
## 一、基礎概念篇
### 1. 什么是MySQL?它的主要特點是什么?
MySQL是由瑞典MySQL AB公司開發的關系型數據庫管理系統(RDBMS),現屬于Oracle旗下產品。核心特點包括:
- 開源免費(社區版)
- 支持多線程高并發
- 提供ACID事務支持
- 支持主從復制和集群部署
- 跨平臺支持(Windows/Linux/macOS)
### 2. MySQL的存儲引擎有哪些?區別是什么?
| 存儲引擎 | 事務支持 | 鎖粒度 | 適用場景 |
|---------|---------|--------|----------|
| InnoDB | 支持 | 行級鎖 | 需要事務、高并發寫 |
| MyISAM | 不支持 | 表級鎖 | 讀多寫少、全文索引 |
| MEMORY | 不支持 | 表級鎖 | 臨時表、高速緩存 |
### 3. CHAR和VARCHAR的區別?
- **CHAR**:定長字符串(0-255字節),存儲時會用空格填充到指定長度
- **VARCHAR**:變長字符串(0-65535字節),只占用實際長度+1-2字節長度標識
---
## 二、索引與優化篇
### 4. MySQL索引有哪些類型?
- **按數據結構分**:
- B+Tree索引(默認)
- Hash索引(MEMORY引擎)
- 全文索引(MyISAM支持)
- **按邏輯分**:
- 主鍵索引(PRIMARY KEY)
- 唯一索引(UNIQUE KEY)
- 普通索引(INDEX)
- 組合索引(多列聯合)
### 5. 什么是B+樹索引?為什么MySQL選擇它?
B+樹是B樹的變種,特點包括:
- 非葉子節點只存鍵值不存數據
- 葉子節點通過指針連接形成鏈表
- 所有數據都存儲在葉子節點
**優勢**:
- 范圍查詢效率高(鏈表遍歷)
- 查詢穩定性好(所有查詢路徑等長)
- 磁盤IO次數少(3-4層可存百萬級數據)
### 6. 什么情況下索引會失效?
- 違反最左前綴原則(組合索引)
- 對索引列進行運算或函數操作
- 使用`!=`、`NOT IN`等否定條件
- 隱式類型轉換(如字符串列用數字查詢)
- `LIKE`以通配符開頭('%abc')
### 7. EXPLN命令各字段含義?
```sql
EXPLN SELECT * FROM users WHERE id = 1;
關鍵字段說明: - type:訪問類型(const > ref > range > index > ALL) - key:實際使用的索引 - rows:預估掃描行數 - Extra:額外信息(Using filesort/Using temporary需優化)
隔離級別 | 臟讀 | 不可重復讀 | 幻讀 | 實現方式 |
---|---|---|---|---|
讀未提交 | ? | ? | ? | 無鎖 |
讀已提交 | × | ? | ? | 快照讀 |
可重復讀 | × | × | ? | MVCC+間隙鎖 |
串行化 | × | × | × | 完全加鎖 |
多版本并發控制(Multi-Version Concurrency Control)通過保存數據的歷史版本實現: - 每行記錄包含兩個隱藏字段:創建版本號、刪除版本號 - 讀操作只查找版本號早于當前事務的數據 - 寫操作創建新版本而非直接修改
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 2;
mysqldumpslow
工具分析日志SHOW PROCESSLIST
查看當前運行線程SELECT *
,只查詢必要字段SHOW SLAVE STATUS
監控復制狀態-- 用戶表
CREATE TABLE users (
user_id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE,
password CHAR(60)
);
-- 商品表
CREATE TABLE products (
product_id BIGINT PRIMARY KEY,
name VARCHAR(100),
price DECIMAL(10,2),
INDEX idx_name (name)
);
-- 訂單表(分庫分表場景)
CREATE TABLE orders_2023 (
order_id VARCHAR(32) PRIMARY KEY,
user_id BIGINT,
status TINYINT,
create_time DATETIME,
INDEX idx_user (user_id)
) PARTITION BY RANGE (YEAR(create_time));
方案對比: 1. 悲觀鎖:
SELECT quantity FROM inventory WHERE item_id=1 FOR UPDATE;
UPDATE inventory SET quantity=quantity-1 WHERE item_id=1;
UPDATE inventory
SET quantity=quantity-1, version=version+1
WHERE item_id=1 AND version=#{version};
RANK()
, ROW_NUMBER()
等WITH
語法支持JSON_TABLE()
等函數本文覆蓋了MySQL面試中最??疾斓?大方向共20個核心問題。實際面試中,面試官往往會根據候選人的回答深度進行追問,建議: 1. 對每個知識點至少掌握2-3層深度 2. 準備1-2個實際項目中的MySQL優化案例 3. 動手實驗關鍵機制(如事務隔離級別、鎖競爭等)
注:本文約2200字,可根據實際需要調整內容深度或補充具體案例。 “`
這篇文章采用Markdown格式編寫,包含: 1. 層級分明的章節結構 2. 表格對比關鍵概念差異 3. 代碼塊展示SQL示例 4. 重點內容加粗/列表突出顯示 5. 覆蓋基礎到高級的知識點 6. 包含實戰設計題和解決方案
可根據具體面試崗位需求,適當調整技術深度或增加云數據庫、分布式事務等擴展內容。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。