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

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

相关推荐
程序员爱钓鱼2 小时前
Go语言实战案例 — 工具开发篇:Go 实现二维码生成器
后端·google·go
绝无仅有2 小时前
面试经验之MySQL 锁与索引实战总结分享
后端·面试·github
在未来等你6 小时前
Elasticsearch面试精讲 Day 13:索引生命周期管理ILM
大数据·分布式·elasticsearch·搜索引擎·面试
程序员码歌9 小时前
明年35岁了,如何破局?说说心里话
android·前端·后端
橙*^O^*安9 小时前
Go 语言基础:变量与常量
运维·开发语言·后端·golang·kubernetes
PAK向日葵9 小时前
【C/C++】面试官:手写一个memmove,要求性能尽可能高
c语言·c++·面试
工程师小星星9 小时前
Golang语言的文件组织方式
开发语言·后端·golang
哈喽姥爷10 小时前
Spring Boot---自动配置原理和自定义Starter
java·spring boot·后端·自定义starter·自动配置原理
舒一笑12 小时前
为什么where=Version就是乐观锁了?
后端·mysql·程序员