常见的MySQL面试题有哪些

发布时间:2021-10-09 15:40:32 作者:iii
来源:亿速云 阅读:161
# 常见的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需优化)


三、事务与锁篇

8. 什么是事务的ACID特性?

9. MySQL的隔离级别有哪些?

隔离级别 脏读 不可重复读 幻读 实现方式
读未提交 无锁
读已提交 × 快照读
可重复读 × × MVCC+间隙锁
串行化 × × × 完全加锁

10. 什么是MVCC?

多版本并发控制(Multi-Version Concurrency Control)通过保存数据的历史版本实现: - 每行记录包含两个隐藏字段:创建版本号、删除版本号 - 读操作只查找版本号早于当前事务的数据 - 写操作创建新版本而非直接修改

11. InnoDB有哪几种锁?


四、性能优化篇

12. 大表优化的常见方案

  1. 垂直拆分:将不常用字段拆分到扩展表
  2. 水平拆分:按时间/ID范围分表(如user_2023)
  3. 读写分离:主库写,从库读
  4. 冷热分离:历史数据归档

13. 慢查询如何排查?

  1. 开启慢查询日志:
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 2;
  1. 使用mysqldumpslow工具分析日志
  2. 通过SHOW PROCESSLIST查看当前运行线程

14. 如何优化JOIN查询?


五、高可用与架构篇

15. 主从复制原理是什么?

  1. Master将变更写入binlog
  2. Slave的IO线程拉取binlog到relay log
  3. Slave的SQL线程重放relay log中的事件
  4. 通过SHOW SLAVE STATUS监控复制状态

16. 分库分表有哪些策略?

17. 如何保证数据库高可用?


六、实战应用题

18. 设计一个电商系统的数据库

-- 用户表
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));

19. 如何处理库存超卖问题?

方案对比: 1. 悲观锁

SELECT quantity FROM inventory WHERE item_id=1 FOR UPDATE;
UPDATE inventory SET quantity=quantity-1 WHERE item_id=1;
  1. 乐观锁
UPDATE inventory 
SET quantity=quantity-1, version=version+1 
WHERE item_id=1 AND version=#{version};
  1. Redis原子操作:DECR + Lua脚本保证原子性

七、最新特性篇(MySQL 8.0+)

20. MySQL 8.0的重要新特性


总结

本文覆盖了MySQL面试中最常考察的7大方向共20个核心问题。实际面试中,面试官往往会根据候选人的回答深度进行追问,建议: 1. 对每个知识点至少掌握2-3层深度 2. 准备1-2个实际项目中的MySQL优化案例 3. 动手实验关键机制(如事务隔离级别、锁竞争等)

注:本文约2200字,可根据实际需要调整内容深度或补充具体案例。 “`

这篇文章采用Markdown格式编写,包含: 1. 层级分明的章节结构 2. 表格对比关键概念差异 3. 代码块展示SQL示例 4. 重点内容加粗/列表突出显示 5. 覆盖基础到高级的知识点 6. 包含实战设计题和解决方案

可根据具体面试岗位需求,适当调整技术深度或增加云数据库、分布式事务等扩展内容。

推荐阅读:
  1. 常见的java面试题有哪些
  2. 常见的Python面试题有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql

上一篇:Google内部的Python代码风格是什么样的

下一篇:从Python到NumPy最接近人类思维的in操作是怎样的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》