MySQL笔记(极客时间)

MySQL笔记(极客时间)
最新回答
眼泪留给我

2021-01-18 03:47:34

MySQL笔记(极客时间)

一、基础篇(SQL查询)

1. SQL语句执行流程
  • 连接器:负责与客户端建立连接,管理连接生命周期。
  • 分析器:对SQL语句进行词法分析、语法分析,生成解析树。
  • 优化器:根据解析树生成执行计划,选择最优索引和执行路径。
  • 执行器:调用存储引擎接口执行查询,返回结果。
  • 存储引擎:负责数据存储和检索(如InnoDB、MyISAM)。

2. 连接管理优化
  • 长连接优势:减少频繁建立连接的开销,提升性能。
  • 长连接问题:内存累积导致占用过高,可能触发系统强制终止(表现为MySQL异常重启)。
  • 解决方案

    定期断开长连接,释放内存资源。

    使用mysql_reset_connection初始化连接,避免完全重建。

二、基础篇(SQL更新)

1. 日志机制
  • redo log(重做日志)

    物理日志,记录数据页修改,用于崩溃恢复。

    采用循环写入方式,空间固定。

  • binlog(归档日志)

    逻辑日志,记录SQL语句或行变更,用于主从复制和数据恢复。

    支持追加写入,文件可滚动增长。

2. 两阶段提交
  • 目的:确保redo log和binlog数据一致性。
  • 流程

    写入redo log(prepare状态)。

    写入binlog。

    提交redo log(commit状态)。

  • 异常处理:若步骤2失败,事务回滚;若步骤3失败,通过binlog恢复时拒绝提交。

三、基础篇(事务隔离)

1. ACID特性
  • 原子性(Atomicity):事务不可分割,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务执行前后,数据从一种状态变为另一种合法状态。
  • 隔离性(Isolation):多事务并发执行时,互不干扰。
  • 持久性(Durability):事务提交后,数据永久保存。
2. 隔离级别与现象

  • 读未提交(Read Uncommitted)

    现象:事务B未提交的修改可被事务A看到。

    示例:V1=V2=V3=2。

  • 读提交(Read Committed)

    现象:事务B提交后的修改才可被事务A看到。

    示例:V1=1,V2=V3=2。

  • 可重复读(Repeatable Read)

    现象:事务内多次读取同一数据结果一致。

    示例:V1=V2=1,V3=2。

  • 串行化(Serializable)

    现象:事务B的修改需等待事务A提交后才能执行。

    示例:V1=V2=1,V3=2。

3. 长事务风险
  • 问题:占用大量回滚段(undo log),导致内存膨胀。
  • 建议:避免长时间运行的事务,定期提交或拆分。

四、索引

1. 索引类型
  • B+树索引

    平衡多路搜索树,适合范围查询和排序。

    叶子节点存储数据或主键,非叶子节点存储索引键。

  • 哈希索引

    基于哈希表实现,仅支持等值查询。

    冲突时性能下降,不支持范围查询。

  • 全文索引

    用于文本内容的模糊匹配。

    依赖分词器处理文本。

2. 索引优化原则
  • 最左前缀匹配:联合索引需按从左到右顺序使用。
  • 区分度高的列优先:选择性高的列(如唯一值多)更适合建索引。
  • 避免索引失效

    不要在索引列上使用函数或计算。

    尽量使用覆盖索引,减少回表操作。

3. 索引选择示例

  • 场景:查询条件为WHERE a=1 AND b=2。
  • 优化:若存在联合索引(a,b),可直接使用;若只有单列索引(a),则需回表查询b列。