03-MongoDB 关联查询:N+1 慢查询、两次查询法与 $lookup
MongoDB无JOIN,可选嵌入、引用后两次查询或$lookup。循环逐条查是N+1;把id去重后一次批量查,往返固定两次,但只适合关联数据仅用于展示,不参与过滤、排序和分页。若关联数据参与过滤排序,或关联表远大于主表,应下推数据库改用$lookup。须给被关联字段建索引,$unwind默认INNER JOIN会丢掉无匹配文档,相关子查询逐条执行,let变量比较难用索引。选型先嵌入,再两次查询法,最后$lookup;大表可引用冗余关键字段。
2026-10-21
|
1
|
0
|
0
02-MongoDB 索引与查询性能:复合索引、覆盖查询与执行计划
MongoDB 无索引会全集合扫描(COLLSCAN)。复合索引字段顺序决定可用查询,应按 ESR 排列:等值、排序、范围;建完必须用 explain("executionStats") 验证,重点看 totalDocsExamined 与 nReturned 是否同量级,否则索引可能未有效筛选。覆盖查询要求查询与返回字段都在同一索引中,并显式排除 _id,从而省去 FETCH。深分页用 skip 会线性变慢,应改为基于游标的键集分页,且排序键需有索引并用 _id 保证唯一顺序。部分索引通常是稀疏索引的超集;TTL 索引仅支持单字段,后台约每 60 秒清理。索引会带来写放大和存储成本,应依据实际慢查询设计,而非给每个字段盲目建索引。
2026-10-20
|
1
|
0
|
0
01-MongoDB 基础:文档模型、CRUD 与聚合管道
文章梳理MongoDB 9.0的文档模型、BSON与_id、嵌入/引用建模、增删改查和聚合管道。核心结论:BSON强类型导致类型不一致时查询可能静默无结果,投产应加validator防脏数据;嵌入适合随父读取且有上限的数据,引用适合无上限、需独立查询或共享的数据;写关注默认w:"majority",insert/update/remove已废弃,应改用新API;聚合中$match应前置以走索引。Spring Boot 4.x配置前缀改为spring.mongodb.*,照旧文会静默连错库。读者可避开类型、建模、写入语义和版本迁移中的常见坑。
2026-10-20
|
6
|
0
|
0
03-MyBatis 分页:三种写法与一个真实项目的落地
分页有三种实现:手写LIMIT最可控但需自写count;MyBatis-Plus与PageHelper在拦截器层改写SQL并额外执行count;内存分页会把全量数据拉入内存,是事故源头。startPage未生效常因中间插入查询或处于异步线程。大表分页慢在count全扫与深分页offset,可用延迟关联缓解。MP 3.5.9后需单引mybatis-plus-jsqlparser;排序字段须白名单校验并设置maxLimit。项目只留一套分页插件,复杂查询须核对实际count SQL。
2026-10-20
|
1
|
0
|
0
02-MyBatis-Plus:把重复的 CRUD 收进框架
MyBatis-Plus在MyBatis上增强而非重写,替代单表CRUD、条件拼装、主键生成、字段填充和逻辑删除,不替代动态SQL、复杂映射、事务、缓存及索引优化。3.5.9起分页需额外引入jsqlparser,拦截器统一且分页最后;3.3.0起ID_WORKER改名ASSIGN_ID。Spring Boot 3须用对应starter。乐观锁更新返回0即失败,自动填充仅实体更新生效。可避开版本与配置坑。
2026-10-20
|
1
|
0
|
0
01-MyBatis 基础:从配置到动态 SQL 与两级缓存
文章说明 MyBatis 主要收走 JDBC 中连接管理、参数设置、结果集遍历与关闭等样板代码,但 SQL 仍需手写。结合 3.5.19 与新版 MySQL Connector/J,强调配置文件元素须按 DTD 顺序、Mapper 要注册、`#{}` 是预编译占位符而 `${}` 用于 SQL 结构且须白名单;同时梳理 SqlSessionFactory/SqlSession 生命周期、驼峰映射、动态 SQL、两级缓存及常见报错。读者可据此避开驱动类、时区、字段映射、注入和连接池耗尽等问题。
2026-10-20
|
2
|
0
|
0
05-MySQL 优化与版本细节:SQL 优化清单与行为差异
本文给出可照改的 MySQL SQL 优化清单,梳理跨版本行为差异。优化先看 EXPLAIN ANALYZE,统计失真先 ANALYZE TABLE;写法上显式列名、LIMIT 配 ORDER BY、条件可走索引、IN 不宜过长,避免前导 %,警惕相关子查询。版本差异重点:VARCHAR 长度按字符,INT(11) 仅显示宽度且已废弃,引号用参数化代替转义,utf8 实为 utf8mb3;JSON 自 5.7 原生支持,8.0.17 起可建多值索引。生产选 LTS,9.7 为当前 LTS,之后改用日历版本号。
2026-10-20
|
1
|
0
|
0
04-MySQL 报表实战:同环比、日期序列与多表连接
MySQL 系列第 4 篇。同环比报表要在同一行里给出本期、上一期、去年同期的几十个指标,折线图还要补出中间没有数据的那几天。这篇拆三件事:三个时间窗怎么各自聚合再横向拼成一行,日期序列怎么用递归 CTE 造出来再左连接补零,同一张表怎么用不同别名连出多表关系。
2026-10-20
|
0
|
0
|
0
03-MySQL 函数专题:CONCAT、CONCAT_WS 与 GROUP_CONCAT
MySQL 系列第 3 篇。字符串拼接是最容易出静默错误的一类操作:CONCAT 遇到 NULL 整条结果就变 NULL,CONCAT_WS 会跳过 NULL 但分隔符为 NULL 时结果也是 NULL,GROUP_CONCAT 默认只给 1024 个字符且超出不报错。这篇讲透三个函数,再把常用函数按类别整理成能直接查的速查表。
2026-10-20
|
0
|
0
|
0
02-MySQL 事务、锁与索引:ACID、隔离级别与索引失效
文章围绕MySQL事务、锁与索引,强调三者相互关联:事务定边界、锁管并发、索引决定锁粒度,并提供双会话可复现实验。核心结论是:ACID由undo log、redo log及锁与MVCC支撑,提交时只保证redo落盘和内存页变更;默认RR靠版本链与ReadView实现一致性读,RC每次快照读重建ReadView;锁分MDL、表级、意向和行级,next-key lock依赖索引,未走索引的UPDATE可能锁全表;死锁会被检测并回滚;索引为B+树,二级索引需回表,联合索引遵循最左前缀。读者可复现实验并排查长事务、锁等待、死锁与索引失效。
2026-10-20
|
2
|
0
|
0