MySQL面经(一)

SQL执行的流程

  1. 连接阶段

    • 客户端建立TCP连接
    • 连接器验证账号权限
  2. 解析阶段

    • 分析器:词法/语法分析
    • 预处理器:检查表/列是否存在
  3. 优化阶段

    • 优化器选择最优执行计划
    • 决定索引使用和JOIN顺序
  4. 执行阶段

    • 执行引擎调用存储引擎接口
    • InnoDB主要操作:
      • 读:检查Buffer Pool → 磁盘
      • 写:undo log → Buffer Pool → redo log
  5. 返回结果

    • 通过连接返回数据给客户端

MySQL的架构

  1. 服务层
    • 连接管理:线程池处理客户端连接;认证和权限验证
    • SQL接口:接收SQL命令(DML/DDL等);返回查询结果
    • 解析器:词法分析 → 语法分析 → 语法树;
    • 优化器:生成执行计划;索引选择(基于成本估算)
    • 查询缓存(8.0已移除)
  2. 存储引擎层
    • InnoDB 事务/行锁/外键 主流OLTP业务
    • MyISAM 表锁/全文索引 读多写少/已逐渐淘汰
    • Memory 内存表/临时表 高速缓存
    • Archive 高压缩比/只追加 日志存储
  3. 物理存储层
    • 表空间文件(.ibd):存储索引和数据(InnoDB)
    • 日志文件:Redo Log(重做日志)、Undo Log(回滚日志)、Binlog(归档日志)

MySQL的事务

事务是将一组数据库操作打包成一个不可分割的工作单元,要么全部执行成功,要么全部回滚到初始状态。

事务的特性

ACID

  • 原子性:事务是最小工作单元,不可再分割;通过 UNDO LOG 实现回滚能力
  • 一致性:事务执行前后数据库保持合法状态
  • 隔离性:并发事务相互隔离(通过锁/MVCC实现)、4种隔离级别控制隔离程度
  • 持久性:事务提交后修改永久有效、通过 REDO LOG 保证故障恢复
事务的隔离级别
  • 读未提交:事务可以读取其他事务未提交的修改 (不加锁) 可能出现:脏读;不可重复读;幻读
  • 读已提交:只能读取已提交的数据 (使用MVCC)可能出现:不可重复读;幻读
  • 可重复读:事务期间多次读取同一数据结果一致 (MVCC+通过间隙锁(Gap Lock)) 可能出现:幻读
  • 串行化:完全串行执行事务(所有SELECT语句自动转为SELECT … FOR SHARE,临键锁(Next-Key Lock)Record Lock+Gap Lock)
脏读、不可重复读、幻读
  • 脏读 (Dirty Read):一个事务读取了另一个未提交事务修改过的数据
  • 不可重复读 (Non-repeatable Read):同一事务内,多次读取同一数据返回不同结果(被其他已提交事务修改)
  • 幻读 (Phantom Read):同一事务内,多次执行相同范围查询返回不同的行集合(被其他已提交事务新增/删除)

MySQL的锁

行锁
  • 记录锁(Record Lock):属于单个行记录上的锁。
  • 间隙锁(Gap Lock):锁定一个范围,不包括记录本身。
  • 临键锁(Next-Key Lock):Record Lock+Gap Lock,锁定一个范围,包含记录本身,主要目的是为了解决幻读问题
全局锁
  • 共享锁(S 锁):又称读锁,事务在读取记录的时候获取共享锁,允许多个事务同时获取(锁兼容)。
  • 排他锁(X 锁):又称写锁/独占锁,事务在修改记录的时候获取排他锁,不允许多个事务同时获取。如果一个记录已经被加了排他锁,那其他事务不能再对这条事务加任何类型的锁(锁不兼容)。
意向锁(表锁)
  • 意向共享锁(Intention Shared Lock,IS 锁):事务有意向对表中的某些记录加共享锁(S 锁),加共享锁前必须先取得该表的 IS 锁。
  • 意向排他锁(Intention Exclusive Lock,IX 锁):事务有意向对表中的某些记录加排他锁(X 锁),加排他锁之前必须先取得该表的 IX 锁。

MySQL的日志

redo Log

redo log 它是物理日志,记录内容是“在某个数据页上做了什么修改”,属于 InnoDB 存储引擎。让 MySQL 拥有了崩溃恢复能力。保证事务的持久性。
在事务执行过程中可以不断写入,且两阶段提交(redo log 的写入拆成了两个步骤prepare和commit)

bin Log

binlog 是逻辑日志,记录内容是语句的原始逻辑,属于MySQL Server 层。MySQL 数据库的数据备份、主备、主主、主从都离不开 binlog,需要依靠 binlog 来同步数据,保证数据一致性。
只在提交事务时才写入

undo Log

每一个事务对数据的修改都会被记录到 undo log ,当执行事务过程中出现错误或者需要执行回滚操作的话,MySQL 可以利用 undo log 将数据恢复到事务开始之前的状态。保证事务的原子性。

MVCC

MVCC 是一种并发控制机制,用于在多个并发事务同时读写数据库时保持数据的一致性和隔离性。它是通过在每个数据行上维护多个版本的数据来实现的。当一个事务要对数据库中的数据进行修改时,MVCC 会为该事务创建一个数据快照,而不是直接修改实际的数据行。

  1. 读操作(SELECT):
    当一个事务执行读操作时,它会使用快照读取。快照读取是基于事务开始时数据库中的状态创建的,因此事务不会读取其他事务尚未提交的修改。
  2. 写操作(INSERT、UPDATE、DELETE):
    当一个事务执行写操作时,它会生成一个新的数据版本,并将修改后的数据写入数据库。
  3. 事务提交和回滚:
    当一个事务提交时,它所做的修改将成为数据库的最新版本,并且对其他事务可见。
    当一个事务回滚时,它所做的修改将被撤销,对其他事务不可见。
实现原理
  • InnoDB通过三个隐藏字段维护数据版本:
    • DB_TRX_ID(6字节):记录创建/最后一次修改该记录的事务ID
    • DB_ROLL_PTR(7字节):回滚指针,指向undo log中的旧版本
    • DB_ROW_ID(6字节):隐含自增行ID(无主键时生成)
  • ReadView机制
    • m_ids:生成ReadView时活跃的事务ID列表
    • min_trx_id:最小活跃事务ID
    • max_trx_id:预分配的下一个事务ID
    • creator_trx_id:创建该ReadView的事务ID
      当用户在这个事务中要读取某个记录行的时候,InnoDB 会将该记录行的 DB_TRX_ID 与 Read View 中的一些变量及当前事务 ID 进行比较,判断是否满足可见性条件
不同隔离级别下的MVCC

读已提交 ReadView生成在每条SELECT语句 总是读取最新已提交版本
可重复读 ReadView生成在事务的第一个SELECT 固定使用事务开始时的数据快照

INNODB

InnoDB 支持 事务(Transaction),适合需要数据一致性的场景,采用 行级锁(Row-Level Locking),适合高并发写入场景(如电商订单)。支持外键(Foreign Key),确保数据完整性。主键索引是聚簇索引,数据文件按主键排序存储,查询主键时效率极高。有 事务日志(redo log),崩溃后能自动恢复。

MyISAM 不支持事务,如果操作中途崩溃,可能导致数据不一致。采用 表级锁(Table-Level Locking),写操作会阻塞所有读操作,不适合高并发写入。 不支持外键,需在应用层维护关联关系。索引和数据文件分离,主键索引和非主键索引都是 非聚簇索引。 崩溃后可能数据损坏,需手动修复(myisamchk 工具)。

### MySQL 试经验和常见问题 #### 数据库基础知识 在Linux系统运维企业试中,除了技术能力和解决问题的能力外,数据库的基础知识也是重要的考核部分[^1]。对于MySQL而言,了解SQL语言和关系型数据库的基本概念是必不可少的。这包括表结构设计、索引创建与优化、事务处理机制等内容。 #### SQL语句编写能力 掌握标准SQL语法并能熟练运用各种子查询、连接操作(JOIN)、聚合函数等高级特性来完成复杂数据检索任务是非常关键的项技能。例如,在多张表格之间建立联系以提取所需信息: ```sql Select t1.*, t2.price from table1 t1 join (select id, price from table2 order by price DESC limit 10) as t2 on t1.id = t2.id; ``` 这段代码展示了如何先筛选出`table2`中的高价商品列表再将其与另张表关联起来获取更多细节[^4]。 #### JDBC基础 作为Java应用程序中最常用的持久化层框架之,JDBC提供了访问不同类型的关系型数据库API接口。熟悉其工作原理有助于更好地理解底层实现逻辑,并能够写出高效稳定的程序代码[^3]。 #### 多结果集合并 当需要将来自不同SELECT命令的结果组合成单输出时可以采用UNION运算符。需要注意的是两个或多个待联合的选择项必须具有相同数量列数且对应位置上的字段类型相匹配。 #### 性能调优策略 性能问题是很多企业在实际生产环境中遇到的最大挑战之。因此候选人应该具备定的分析工具使用经验以及针对特定场景下的解决方案建议,比如通过调整配置参数或者重构低效查询等方式提高整体运行效率。 #### 安全性和备份恢复方案 安全始终是个重要话题,尤其是在涉及到敏感商业信息保护方更是如此;而定期做好增量/完全备份计划则可以在意外发生后迅速恢复正常业务运作状态。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值