这是一个关于 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 log 和 undo 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 格式:结合 ROW 和 STATEMENT,根据具体情况选择格式。
5. MySQL 的隔离级别有几种,默认的隔离级别是什么,互联网常用的隔离级别是什么?隔离级别与锁的关系
编辑
- 四种隔离级别:
- READ UNCOMMITTED:最低级别,允许脏读。
- READ COMMITTED:避免脏读,但允许不可重复读。
- REPEATABLE READ:避免脏读和不可重复读,MySQL 默认隔离级别。
- SERIALIZABLE:最高级别,完全避免并发,性能较差。
- 锁的关系:
- 高隔离级别通常需要更多的锁,以保证事务的一致性和完整性。
6. 什么是幻读,脏读,不可重复读呢?MySQL 是怎么处理幻读的?
- 脏读:读取未提交事务的数据。
- 不可重复读:同一事务中,读取到不同的数据值。
- 幻读:同一事务中,查询结果集发生变化,通常由于其他事务的插入或删除操作。
- MySQL 处理幻读:通过 REPEATABLE READ 隔离级别结合 间隙锁(Gap Lock) 来避免幻读。
深度解读
基础篇
-
SQL语句的执行过程:
- 解析阶段:解析 SQL 语句并检查语法。
- 优化阶段:生成执行计划,选择合适的索引和查询方式。
- 执行阶段:根据执行计划进行数据查询。 -
三大范式:
- 1NF:字段不可分割。
- 2NF:满足 1NF,且非主键字段完全依赖于主键。
- 3NF:满足 2NF,且非主键字段不依赖于其他非主键字段。 -
count(1)、count(*)和count(列名)的区别:
-count(*):统计所有行。
-count(1):也统计所有行,但略微慢于count(*)。
-count(列名):只统计非 NULL 的行。 -
int(20)、char(20)、varchar(20)的区别:
-int(20):表示整数类型,不影响存储大小。
-char(20):固定长度,20 个字符。
-varchar(20):变长,最多 20 个字符。 -
分组查询注意事项:
- 使用GROUP BY时,字段必须出现在SELECT中或者被聚合函数处理。
- 使用HAVING筛选分组后的数据。
事务篇
-
ACID 和 MySQL 事务机制:
- ACID:原子性、一致性、隔离性、持久性。
- MySQL 保证 ACID:使用 InnoDB 引擎,通过 redo log 和 undo log 保证事务的可靠性。 -
两阶段提交:
- 阶段一:锁定数据。
- 阶段二:检查事务是否成功,成功则提交。 -
redo log 和 undo log:
- redo log:记录已提交事务的变更,用于恢复。
- undo log:记录事务前状态,用于回滚。
- WAL 技术:先写日志,再更新数据。 -
redo log 和 bin log 的区别:
- redo log:事务日志,用于崩溃恢复。
- bin log:记录数据库变更操作,用于复制和备份。 -
binlog 格式:
- ROW:记录每一行数据的变化。
- STATEMENT:记录 SQL 语句。
- MIXED:结合ROW和STATEMENT。 -
MySQL 隔离级别:
- 四种隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ(默认)、SERIALIZABLE。
- 隔离级别决定了事务之间的可见性及锁的粒度。 -
幻读、脏读、不可重复读:
- 脏读:读取未提交事务的数据。
- 不可重复读:同一事务中读取到不同的值。
- 幻读:同一事务中查询结果集发生变化。
- MySQL 处理幻读:通过REPEATABLE READ隔离级别和间隙锁(Gap Lock)来解决。
编辑这个总结涵盖了面试过程中可能遇到的 MySQL 基础和事务相关的问题,帮助更好地理解 MySQL 的工作原理及其优化。