面试之MySQL基础和事务实战经验总结与分享

139 阅读6分钟

这是一个关于 MySQL 的面试经验总结,包括基础篇和事务篇的相关问题和答案,帮助理解 MySQL 的执行原理、事务处理及其优化。​编辑


MySQL 面试经验总结

基础篇

1. 一条 SQL 语句在 MySQL 中如何执行的?

   - 解析阶段:MySQL 解析 SQL 语句,检查语法。
- 优化阶段:生成执行计划,选择最优的索引和查询方法。
- 执行阶段:按照执行计划执行查询操作,返回结果。

2. 说一下数据库的三大范式

   - 第一范式 (1NF):每个字段都是不可分割的原子值。
- 第二范式 (2NF):满足 1NF,并且每个非主键字段完全依赖于主键。
- 第三范式 (3NF):满足 2NF,并且非主键字段不依赖于其他非主键字段。

3. count(1)count(*)count(列名) 的区别

   - count(*):统计所有行,效率较高。
- count(1):也统计所有行,但比 count(*) 稍慢。
- count(列名):只统计该列非 NULL 的行数,列为 NULL 时不计数。

4. MySQL 中 int(20)char(20) 以及 varchar(20) 的区别

   - int(20):表示整数类型,括号中的 20 是显示宽度,不影响存储大小。
- char(20):固定长度的字符串,存储 20 个字符,空间填充。
- varchar(20):变长字符串,存储长度为实际字符数,最大 20 个字符。

5. 分组查询需要注意什么条件?

   - GROUP BY:分组时,必须选择 GROUP BY 中的字段或者使用聚合函数的字段。
- HAVING:用于筛选分组后的数据,不能用 WHERE


事务篇

​编辑

1. ACID 了解吗,MySQL 是用什么机制保证的?两阶段提交能讲一下吗?

   - ACID
- 原子性 (Atomicity):事务是一个原子操作,要么完全成功,要么完全失败。
- 一致性 (Consistency):事务开始和结束时数据库的一致性。
- 隔离性 (Isolation):事务间相互独立,彼此的操作不可见。
- 持久性 (Durability):事务一旦提交,修改是永久性的。
- MySQL 保证 ACID
- 使用 InnoDB 存储引擎,通过 redo logundo log 保障 ACID 特性。
- 两阶段提交
- 阶段一:事务开始时锁定相关数据。
- 阶段二:提交时检查是否所有事务都成功,若成功则提交。

2. redo log 和 undo log 说一下,什么是 WAL 技术?

   - redo log:记录所有已提交事务的更改,用于系统崩溃恢复。
- undo log:记录事务操作前的状态,用于回滚操作。
- WAL(Write Ahead Logging):日志先写入磁盘,然后再更新数据页,以保证数据一致性。

3. redo log 和 bin log 的区别

   - redo log:事务日志,用于数据恢复。
- bin log:二进制日志,用于记录所有数据库修改操作,用于数据复制和备份。

4. MySQL 的 binlog 有几种录入格式?分别有什么区别?

   - ROW 格式:记录每一行数据的变化,精确记录变动。
- STATEMENT 格式:记录 SQL 语句,重放时执行相同的 SQL。
- MIXED 格式:结合 ROWSTATEMENT,根据具体情况选择格式。

5. MySQL 的隔离级别有几种,默认的隔离级别是什么,互联网常用的隔离级别是什么?隔离级别与锁的关系​编辑

   - 四种隔离级别
- READ UNCOMMITTED:最低级别,允许脏读。
- READ COMMITTED:避免脏读,但允许不可重复读。
- REPEATABLE READ:避免脏读和不可重复读,MySQL 默认隔离级别。
- SERIALIZABLE:最高级别,完全避免并发,性能较差。
- 锁的关系
- 高隔离级别通常需要更多的锁,以保证事务的一致性和完整性。

6. 什么是幻读,脏读,不可重复读呢?MySQL 是怎么处理幻读的?

   - 脏读:读取未提交事务的数据。
- 不可重复读:同一事务中,读取到不同的数据值。
- 幻读:同一事务中,查询结果集发生变化,通常由于其他事务的插入或删除操作。
- MySQL 处理幻读:通过 REPEATABLE READ 隔离级别结合 间隙锁(Gap Lock) 来避免幻读。


深度解读

基础篇
  1. SQL语句的执行过程
    - 解析阶段:解析 SQL 语句并检查语法。
    - 优化阶段:生成执行计划,选择合适的索引和查询方式。
    - 执行阶段:根据执行计划进行数据查询。

  2. 三大范式
    - 1NF:字段不可分割。
    - 2NF:满足 1NF,且非主键字段完全依赖于主键。
    - 3NF:满足 2NF,且非主键字段不依赖于其他非主键字段。

  3. count(1)count(*)count(列名) 的区别
    - count(*):统计所有行。
    - count(1):也统计所有行,但略微慢于 count(*)
    - count(列名):只统计非 NULL 的行。

  4. int(20)char(20)varchar(20) 的区别
    - int(20):表示整数类型,不影响存储大小。
    - char(20):固定长度,20 个字符。
    - varchar(20):变长,最多 20 个字符。

  5. 分组查询注意事项
    - 使用 GROUP BY 时,字段必须出现在 SELECT 中或者被聚合函数处理。
    - 使用 HAVING 筛选分组后的数据。

事务篇
  1. ACID 和 MySQL 事务机制
    - ACID:原子性、一致性、隔离性、持久性。
    - MySQL 保证 ACID:使用 InnoDB 引擎,通过 redo log 和 undo log 保证事务的可靠性。

  2. 两阶段提交
    - 阶段一:锁定数据。
    - 阶段二:检查事务是否成功,成功则提交。

  3. redo log 和 undo log
    - redo log:记录已提交事务的变更,用于恢复。
    - undo log:记录事务前状态,用于回滚。
    - WAL 技术:先写日志,再更新数据。

  4. redo log 和 bin log 的区别
    - redo log:事务日志,用于崩溃恢复。
    - bin log:记录数据库变更操作,用于复制和备份。

  5. binlog 格式
    - ROW:记录每一行数据的变化。
    - STATEMENT:记录 SQL 语句。
    - MIXED:结合 ROWSTATEMENT

  6. MySQL 隔离级别
    - 四种隔离级别READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READ(默认)、SERIALIZABLE
    - 隔离级别决定了事务之间的可见性及锁的粒度。

  7. 幻读、脏读、不可重复读
    - 脏读:读取未提交事务的数据。
    - 不可重复读:同一事务中读取到不同的值。
    - 幻读:同一事务中查询结果集发生变化。
    - MySQL 处理幻读:通过 REPEATABLE READ 隔离级别和间隙锁(Gap Lock)来解决。

​编辑这个总结涵盖了面试过程中可能遇到的 MySQL 基础和事务相关的问题,帮助更好地理解 MySQL 的工作原理及其优化。