您好,登录后才能下订单哦!
# 常见的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面试中最常考察的7大方向共20个核心问题。实际面试中,面试官往往会根据候选人的回答深度进行追问,建议: 1. 对每个知识点至少掌握2-3层深度 2. 准备1-2个实际项目中的MySQL优化案例 3. 动手实验关键机制(如事务隔离级别、锁竞争等)
注:本文约2200字,可根据实际需要调整内容深度或补充具体案例。 “`
这篇文章采用Markdown格式编写,包含: 1. 层级分明的章节结构 2. 表格对比关键概念差异 3. 代码块展示SQL示例 4. 重点内容加粗/列表突出显示 5. 覆盖基础到高级的知识点 6. 包含实战设计题和解决方案
可根据具体面试岗位需求,适当调整技术深度或增加云数据库、分布式事务等扩展内容。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。