数据存储
MySQL 的查询优化与结果正确性、事务与锁、复制与故障切换、备份恢复与大表治理,以及 Elasticsearch 的核心机制。
从哪里开始
按「查询 → 并发 → 可靠性 → 规模」的顺序读:先用 Explain 与 SQL 调优处理慢查询,报表数字对不上时读结果粒度与时间窗口两篇;再用 MVCC 与行锁建立并发模型;然后从 Redo/Undo 走到复制、故障切换与误删恢复;最后看表设计、大表拆分、清理与导入。
文章
01读懂 Explain 执行计划type、key_len 与 Extra 的读法,EXPLAIN ANALYZE 定位瓶颈,四种索引失效实测→02SQL 调优实战优化器为什么放着好索引不用:ORDER BY id LIMIT 陷阱的五种修复、联合索引列顺序、深分页的游标写法与索引的写入代价→03JOIN 之后,合计从 480 变成了 880连接改变了一行代表什么:扇出、DISTINCT 修不了的情况、先聚合再连接、四种计数、外连接后过滤、NOT IN 遇到 NULL→04统计到月底那天,数据少了一天BETWEEN 的上界与半开区间、会话时区、LAG 不是前一天、连续与累计、并列排名、默认窗口帧、ROLLUP 的 NULL→05InnoDB MVCC 与隔离级别Read View 可见性判断、快照读与当前读、幻读的条件化回答、RC 与 RR 的锁差异、长事务→06InnoDB 行锁锁的是什么data_locks 实测记录锁、间隙锁与 Next-Key Lock,RR 与 RC 对比,先查后插的死锁,索引如何决定锁范围→07用数据库表当队列自增 id 的分配顺序不是提交顺序,按「大于上次最大 id」拉取会永久跳过晚提交的行;按状态 SKIP LOCKED 认领、租约与幂等→08Redo Log 与 Undo Log一条 UPDATE 的写入路径、两阶段提交、崩溃恢复实测与持久性参数的故障模型→09MySQL 复制与延迟一笔事务抵达副本的四个位置,大事务、热点行与链路静默中断,并行回放能解决什么→10MySQL 故障切换与读一致性异步与半同步的确认点、切换流程与缺失核对、重试幂等、写后读策略与旧 source 接回→11MongoDB 仲裁节点不存数据PSA 副本集停掉一个数据节点后 w:majority 超时但已写入、默认写关注是 w:1、主节点切换后旧写入被回滚→12MySQL 误删恢复与 PITR全量备份加 binlog 按 GTID 重放,跳过误删补回合法写入,分层证明恢复结果正确→13表设计里的三个细节逻辑删除与唯一约束、IP 地址存储、热点行更新的实测与解法→14单表多大该拆分实测 B+ 树层高与扇出,大表真正的代价,从优化到分库分表的演进路径→15千万级大表怎么清理数据一次性删除的锁与 Binlog 代价、分批删除、DROP PARTITION 与空间回收→16百万行数据导入流式读取、rewriteBatchedStatements 实测、批处理失败语义与可重跑设计→17OLTP 与 OLAP行存与列存的实测对比,以及报表查询什么时候该搬出 MySQL→18Elasticsearch 核心机制倒排索引与分词、分片路由、查询与取回两阶段、近实时刷新实测→19ES 聚合为什么不准terms 聚合的排名误差实测、shard_size 取舍,以及搜索队列打满的排查→20bulk 返回 200 也可能有失败逐项错误、只重试失败项与自动 ID 整批重试的重复、create 冲突、外部版本号挡住乱序的旧值→21写了 180 MB,磁盘实际写了 700 MBRocksDB 顺序键写放大 1.0、随机键 3.9;同一批键写 5 遍占 5 份空间;删除后文件反而变大,压实后才回收→22新盘跑分很快,用了一个月就慢下来了固态盘不能原地覆盖;空块用完后垃圾回收介入;预留空间、填充程度与释放通知决定稳态水平;怎样做预处理后的测试(无实测)→