反模式与修正
| 反模式 | 后果 | 修正方向 |
|---|---|---|
| 文档内无界数组 | 文档膨胀、写放大、达到 16MB 上限 | 拆子集合或按时间窗分桶 |
| 未锚定正则 /^.*x/ | 全集合扫描,CPU 高 | 前缀锚定或用 text/搜索索引 |
| 把 ES 当主库用 | 刷新、合并与恢复语义不适合交易数据 | 主存储用数据库,ES 做检索副本 |
| 深分页 skip 十万 | 每页越翻越慢 | 键集/游标分页 |
| 单调键做分片键 | 写热点集中在单个分片 | 散列分片键或复合键 |
| 集合上建十几个索引 | 写入放大、内存占用高 | 按查询清单裁剪与合并索引 |
无界数组的改造示意
无界数组的改造示意
// 反模式:events 数组无限追加
// { _id: 1, events: [ ... 长期增长 ... ] }
// 修正:拆成子集合,按 (ownerId, ts) 建索引
db.user_events.insertOne({ ownerId: 1, ts: new Date(), type: "login" })
db.user_events.createIndex({ ownerId: 1, ts: -1 })反模式的共同点是违背引擎的设计假设:先理解存储与索引机制(见 LSM、倒排索引等条目),再对照自己的查询与增长模式排查。