MongoDB 聚合管道实践
订单统计:按天/按商品/按地区多维分析。用 MySQL 需要复杂的 GROUP BY 和多表 JOIN,MongoDB 聚合管道一行搞定。 一、聚合管道简介 1.1 管道的概念——文档流经多个阶段,逐步处理 1.2 常用阶段——$match / $group / $sort / $project / $lookup 1.3 与传统 SQL 的对应关系 二、$match——过滤 2.1 等价于 WHERE 2.2 尽量放在管道最前面——减少后续处理量 2.3 支持索引 三、$group——分组聚合 3.1 等价于 GROU...
Elasticsearch 倒排索引原理
ES 为什么能这么快搜索出结果?倒排索引 + FST + Skip List 的组合,近实时搜索的秘密。 一、全文搜索的挑战 1.1 MySQL LIKE '%keyword%'——全表扫描 1.2 全文索引的局限性——不支持复杂查询 1.3 ES 的优势——分布式 + 倒排索引 二、倒排索引的结构 2.1 正排索引——文档 ID → 内容 2.2 倒排索引——词项 → 文档 ID 列表 2.3 Posting List——包含该词的文档列表 2.4 Term Dictionary——所有词项的有序集合 三、Term Dictionary 的压缩 3.1 FST(...
数据冷热分离方案
订单表 2 亿行,但 90% 的查询只用到近 3 个月的数据。冷热分离让数据库轻装上阵。 一、冷热分离的核心理念 1.1 热数据——频繁访问的近期的数据 1.2 冷数据——很少访问的历史数据 1.3 时间维度 vs 状态维度 1.4 目标——热库保持小体积高性能 二、方案 1:同库分区 2.1 MySQL 分区表——PARTITION BY RANGE (TO_DAYS(create_time)) 2.2 优点——应用层无感知 2.3 缺点——单库压力仍在 三、方案 2:冷热分表 3.1 热表——order_2025(当前年) 3.2 冷表——order_2024、order_2...
跨库查询方案对比
没分库分表前一个 JOIN 搞定的事,分完后变得异常复杂。跨库查询的 6 种方案,各有千秋。 一、跨库查询的困境 1.1 分库分表前——SELECT * FROM order JOIN user ON ... 1.2 分库分表后——订单和用户在不同库 1.3 问题的本质——数据分散后的聚合查询 二、方案 1:字段冗余 2.1 把频繁查询的字段冗余到订单表——用户名、手机号 2.2 更新时的数据一致性——MQ 异步更新 2.3 优缺点——查询快但数据一致性问题 三、方案 2:ES 异构同步 3.1 Canal 监听 binlog → 同步到 ES 3.2 ES 的搜索和聚合能力替代...
ShardingSphere 分库分表实践
单表 5000 万行,查询越来越慢。分库分表是必经之路,但分片键怎么选?ShardingSphere-JDBC 如何落地? 一、什么时候需要分库分表 1.1 单表数据量过大——超过千万级 1.2 单库连接数瓶颈——MySQL 建议 < 2000 1.3 单库磁盘和 IO 瓶颈 1.4 分库 vs 分表 vs 分库分表的选择 二、分片策略 2.1 取模分片——user_id % 4,均匀但扩容困难 2.2 范围分片——user_id BETWEEN 1 AND 10000000,扩容方便但不均匀 2.3 一致性哈希——扩容时迁移数据最少 2.4 复合分片——多维度分片 三、分...
主从复制延迟处理
刚下单,订单列表里看不到——主从延迟导致的”写后读不一致”问题,怎么排查和解决? 一、主从复制的原理 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...