有哪些常见的MySQL面试题

发布时间:2021-10-09 17:03:57 作者:iii
来源:亿速云 阅读:191
# 有哪些常见的MySQL面试题

## 目录
1. [基础概念](#基础概念)
2. [存储引擎](#存储引擎)
3. [索引](#索引)
4. [事务](#事务)
5. [锁机制](#锁机制)
6. [性能优化](#性能优化)
7. [高可用与主从复制](#高可用与主从复制)
8. [SQL语句](#sql语句)
9. [数据库设计](#数据库设计)
10. [实战场景](#实战场景)

---

## 基础概念

### 1. 什么是MySQL?它有什么特点?
MySQL是一个开源的关系型数据库管理系统(RDBMS),具有以下特点:
- 支持标准SQL语法
- 跨平台支持(Windows/Linux/macOS)
- 支持多用户并发访问
- 提供多种存储引擎(InnoDB、MyISAM等)
- 事务处理能力(ACID特性)

### 2. 关系型数据库与非关系型数据库的区别?
| 特性 | 关系型数据库 | 非关系型数据库 |
|------|------------|--------------|
| 数据结构 | 表结构 | 文档/键值对/图等 |
| 扩展方式 | 垂直扩展 | 水平扩展 |
| 事务支持 | ACID | BASE |
| 典型产品 | MySQL/Oracle | MongoDB/Redis |

### 3. MySQL的默认端口号是什么?
默认端口是3306

---

## 存储引擎

### 4. InnoDB和MyISAM的主要区别?
| 对比项 | InnoDB | MyISAM |
|--------|--------|--------|
| 事务支持 | ✔️ | ✖️ |
| 外键支持 | ✔️ | ✖️ |
| 锁粒度 | 行锁 | 表锁 |
| 崩溃恢复 | 支持 | 不支持 |
| 全文索引 | 5.6+支持 | 支持 |

### 5. 如何选择合适的存储引擎?
- 需要事务:InnoDB
- 只读/大量读操作:MyISAM
- 临时表:MEMORY
- 归档数据:ARCHIVE

---

## 索引

### 6. MySQL有哪些索引类型?
1. **普通索引**:最基本的索引
2. **唯一索引**:列值必须唯一
3. **主键索引**:特殊的唯一索引,不允许NULL
4. **复合索引**:多列组合的索引
5. **全文索引**:用于文本搜索(仅限CHAR/VARCHAR/TEXT)

### 7. B+树索引的原理是什么?
- 多路平衡查找树
- 非叶子节点只存储键值
- 叶子节点形成有序链表
- 适合范围查询和排序操作

### 8. 什么情况下索引会失效?
- 使用`!=`或`<>`操作符
- 对索引列进行函数操作
- 使用`OR`连接条件(除非所有列都有索引)
- 最左前缀原则未被遵守
- 列类型不匹配(如字符串用数字比较)

---

## 事务

### 9. 什么是ACID特性?
- **原子性(Atomicity)**:事务是不可分割的工作单位
- **一致性(Consistency)**:事务执行前后数据库状态一致
- **隔离性(Isolation)**:并发事务间互不干扰
- **持久性(Durability)**:事务提交后结果永久保存

### 10. 事务隔离级别有哪些?
| 级别 | 脏读 | 不可重复读 | 幻读 |
|------|------|-----------|------|
| READ UNCOMMITTED | ✔️ | ✔️ | ✔️ |
| READ COMMITTED | ✖️ | ✔️ | ✔️ |
| REPEATABLE READ(MySQL默认) | ✖️ | ✖️ | ✔️ |
| SERIALIZABLE | ✖️ | ✖️ | ✖️ |

---

## 锁机制

### 11. MySQL有哪些锁类型?
- **共享锁(S锁)**:读锁,多个事务可同时持有
- **排他锁(X锁)**:写锁,独占资源
- **意向锁**:表级锁,表明事务将要获取的行锁类型
- **记录锁**:锁定索引记录
- **间隙锁**:锁定索引记录间的间隙
- **临键锁**:记录锁+间隙锁的组合

### 12. 什么是死锁?如何避免?
**死锁**:两个或多个事务互相持有对方需要的资源  
**解决方案**:
- 设置合理的超时时间(innodb_lock_wait_timeout)
- 按固定顺序访问表和行
- 使用`SHOW ENGINE INNODB STATUS`分析死锁

---

## 性能优化

### 13. EXPLN命令各字段含义?
| 字段 | 说明 |
|------|------|
| id | 查询标识符 |
| select_type | 查询类型(SIMPLE/PRIMARY/SUBQUERY等) |
| table | 访问的表 |
| type | 访问类型(const/ref/range等) |
| possible_keys | 可能使用的索引 |
| key | 实际使用的索引 |
| rows | 预估需要读取的行数 |

### 14. 大表优化方案有哪些?
1. 垂直/水平分表
2. 建立合适的索引
3. 冷热数据分离
4. 使用缓存(Redis)
5. 优化SQL语句
6. 考虑分库分表(Sharding)

---

## 高可用与主从复制

### 15. 主从复制原理是什么?
1. Master将变更写入binlog
2. Slave的IO线程请求Master的binlog
3. Master的dump线程发送binlog给Slave
4. Slave的SQL线程重放binlog中的事件

### 16. 如何保证主从数据一致性?
- 使用半同步复制(semi-sync replication)
- 定期校验数据(pt-table-checksum)
- 设置`sync_binlog=1`和`innodb_flush_log_at_trx_commit=1`

---

## SQL语句

### 17. 常用聚合函数有哪些?
- `COUNT()`:计数
- `SUM()`:求和
- `AVG()`:平均值
- `MAX()/MIN()`:最大/最小值
- `GROUP_CONCAT()`:连接字符串

### 18. JOIN的类型和区别?
- **INNER JOIN**:返回匹配的行
- **LEFT JOIN**:返回左表所有行+匹配的右表行
- **RIGHT JOIN**:返回右表所有行+匹配的左表行
- **FULL JOIN**:返回所有匹配和不匹配的行(MySQL不支持)
- **CROSS JOIN**:笛卡尔积

---

## 数据库设计

### 19. 三范式是什么?
1. **第一范式(1NF)**:字段不可再分
2. **第二范式(2NF)**:消除部分依赖
3. **第三范式(3NF)**:消除传递依赖

### 20. 什么情况下需要反范式设计?
- 需要提高查询性能
- 频繁进行多表JOIN操作
- 数据仓库/报表系统等读密集型场景

---

## 实战场景

### 21. 如何处理慢查询?
1. 使用`slow_query_log`定位慢SQL
2. 通过`EXPLN`分析执行计划
3. 优化索引或重构SQL
4. 考虑查询缓存
5. 调整服务器参数(如`sort_buffer_size`)

### 22. 如何安全地删除大量数据?
1. 分批删除(每次删除限定数量)
2. 低峰期执行
3. 先备份再删除
4. 考虑使用分区表
5. 对于日志类数据可设置TTL

### 23. 分库分表有哪些策略?
- **水平分表**:按行拆分到多个表(如按ID范围)
- **垂直分表**:按列拆分(将大字段分离)
- **哈希分片**:对分片键取模
- **范围分片**:按时间/ID范围划分
- **地理分片**:按地域划分

---

## 总结
本文整理了MySQL面试中最常见的23个问题,涵盖基础概念、存储引擎、索引、事务、锁机制等核心知识点。建议求职者:
1. 理解每个概念背后的原理
2. 结合实际工作经验回答问题
3. 准备1-2个性能优化的实战案例
4. 关注MySQL 8.0的新特性(如窗口函数、CTE等)

> 注:本文共约3050字,可根据实际面试需求调整内容深度和侧重点。

这篇文章采用Markdown格式编写,包含: 1. 清晰的层级结构(10个大类) 2. 表格对比关键概念 3. 代码块展示SQL示例 4. 有序/无序列表组织内容 5. 重点内容加粗/高亮显示 6. 完整的字数统计说明

可根据需要进一步扩展具体问题的详细解答或添加更多实战案例。

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

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

mysql

上一篇:如何理解MySQL集群优化

下一篇:Python如何提取Excel文本框内容

相关阅读

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

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