主从复制延迟处理
刚下单,订单列表里看不到——主从延迟导致的”写后读不一致”问题,怎么排查和解决? 一、主从复制的原理 1.1 异步复制——主库不等待从库 1.2 binlog 传输——IO 线程接收 → Relay Log → SQL 线程执行 1.3 延迟产生的原因——SQL 线程是单线程的(5.6 之前) 二、延迟的度量 2.1 SHOW SLAVE STATUS——Seconds_Behind_Master 2.2 注意——为 NULL 或 0 不代表没有延迟 2.3 Percona Toolkit——pt-heartbeat 更精确 三、延迟的常见原因 3.1 主库大事务——binlog...
MySQL 锁机制详解
死锁是怎么发生的?SELECT ... FOR UPDATE 到底锁了什么?本文系统梳理 MySQL 的锁体系。 一、锁的分类总览 1.1 按粒度——全局锁、表级锁、行级锁 1.2 按模式——共享锁(S)、排他锁(X)、意向锁(IS/IX) 1.3 按算法——记录锁、间隙锁、临键锁 二、全局锁 2.1 FLUSH TABLES WITH READ LOCK——全库只读 2.2 使用场景——全库备份(mysqldump --master-data) 2.3 风险——业务停摆 三、表级锁 3.1 表锁——LOCK TABLES ... READ/WRITE 3.2 元数据锁...
MySQL 事务隔离与 MVCC
可重复读级别下,为什么读不到别的事务已提交的数据?MVCC(多版本并发控制)是 InnoDB 的答案。 一、事务的 ACID 1.1 Atomicity——redo log(重做日志) 1.2 Consistency——由其他三个保证 1.3 Isolation——MVCC + 锁 1.4 Durability——redo log 二、四种隔离级别 2.1 READ UNCOMMITTED——脏读 2.2 READ COMMITTED——不可重复读 2.3 REPEATABLE READ(InnoDB 默认)——幻读(部分解决) 2.4 SERIALIZABLE——串行化 三、M...
慢 SQL 优化实践
订单列表接口线上响应 3 秒,用户投诉不断。本文还原从发现到优化的全过程。 一、问题发现 1.1 监控告警——接口 RT P99 超 3 秒 1.2 慢查询日志——long_query_time = 1s 1.3 定位到具体 SQL 二、分析阶段 2.1 EXPLAIN 执行计划——type=ALL,全表扫描 2.2 表数据量——订单表 500 万行 2.3 当前的索引情况 三、优化 1:添加索引 3.1 创建 idx_user_status_time(user_id, status, create_time) 3.2 EXPLAIN 对比——type=ref...
MySQL EXPLAIN 字段解读
EXPLAIN 是 SQL 优化的第一工具。本文完整解读每个字段,并附 10 个生产案例。 一、EXPLAIN 基础 1.1 EXPLAIN 的作用——查看执行计划 1.2 EXPLAIN FORMAT=JSON——更详细的信息 1.3 EXPLAIN ANALYZE(MySQL 8.0.18+)——实际执行时间 二、id——查询的序号 2.1 id 相同——从上到下执行 2.2 id 不同——id 越大越先执行 2.3 子查询和联合查询的 id 表现 三、select_type——查询类型 3.1 SIMPLE——简单查询 3.2 PRIMARY——最外层查询 3.3 SUBQ...
SQL 执行全链路
SELECT * FROM user WHERE id = 1 —— 这简单一行,在 MySQL 内部经历了什么? 一、MySQL 整体架构 1.1 Server 层——连接器、查询缓存、分析器、优化器、执行器 1.2 存储引擎层——InnoDB / MyISAM / Memory 1.3 架构图——各组件的位置 二、连接器 2.1 TCP 握手 + 身份认证 2.2 权限读取——连接建立时读取,之后不变 2.3 连接管理——wait_timeout 空闲连接超时 2.4 长连接 vs 短连接——长连接 OOM 问题 三、查询缓存(MySQL 8.0 已移除)...
MySQL 索引与 B+Tree 原理
为什么 MySQL 选择 B+Tree 而不是 B-Tree 或红黑树?最左前缀原则的根本原因是什么?从数据结构讲起。 一、索引的本质——排序的数据结构 1.1 索引 = 预排序 + 快速查找 1.2 没有索引时——全表扫描 1.3 有索引时——二分查找的变种 二、为什么是 B+Tree 2.1 哈希表——等值查询快,范围查询不行 2.2 二叉搜索树——高度太高,磁盘 IO 多 2.3 B-Tree——非叶子节点也存数据,范围查询仍需中序遍历 2.4 B+Tree——数据只存叶子节点,叶子节点双向链表连接 三、B+Tree 的结构 3.1 页(Page)——InnoDB...