这是一个关于 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 的工作原理及其优化。