华为云 DDS 文档数据库实战:索引设计、慢操作定位与连接池调优

举报
yd_253000176 发表于 2026/11/04 09:22:10 2026/11/04
【摘要】 围绕华为云 DDS 文档数据库,梳理索引设计的四条规矩、慢日志与 explain 的定位路径、连接池与读写关注配置,以及分片键选择与三处真实踩坑。

一、先弄清 DDS 的读写模型

华为云 DDS 提供 MongoDB 兼容的文档数据库,多数性能问题并不出在实例规格上,而是出在文档结构、索引与访问模式上。与关系库不同,DDS 的索引建立在文档字段之上,嵌套文档与数组字段的索引行为差异很大,一处多键索引的误用就可能让原本毫秒级的查询退化为全集合扫描。

二、索引设计的四条硬规矩

第一,等值条件字段放在复合索引前面,范围条件字段放在后面,最左前缀原则在 DDS 上同样成立。第二,排序字段必须进入索引,否则内存排序超过 32MB 会直接报错返回。第三,数组字段上建立多键索引要控制基数,单个数组元素过多会让索引体积膨胀,写入放大非常明显。第四,不要给看起来会被查询的字段盲目加索引,每个索引都要付出写入代价,写多读少的集合索引数量建议控制在三个以内。建索引时优先使用后台方式,避免大集合阻塞业务写入:

db.orders.createIndex({ tenantId: 1, status: 1, createdAt: -1 }, { background: true })

三、慢操作定位的两条路径

第一站看慢日志。在控制台把 slowOpThresholdMs 调整到 100 毫秒,日志会记录超过阈值的操作,重点看 planSummary 以及 keysExamined 与 nreturned 的比值。如果 keysExamined 比 nreturned 大出几十倍,说明索引选择性不足;如果 planSummary 是 COLLSCAN,说明查询根本没用上索引。第二站用 explain 验证执行计划:

db.orders.find({ tenantId: 't1001', status: 'PAID' }).sort({ createdAt: -1 }).limit(20).explain('executionStats')

关注 totalKeysExamined、totalDocsExamined 与 executionTimeMillis 三个数值。理想状态下前两者都接近 limit 的数量。如果执行计划里出现 SORT 阶段,说明排序字段没有进入索引。

四、连接池与读写关注

客户端侧最常见的坑是连接池配置过小。pymongo 的 maxPoolSize 默认是 100,不少框架会把它改成 10,高并发下大量请求排队等待连接,表现出来却是数据库变慢。建议按单实例并发线程数乘以 1.2 来估算,并开启 retryWrites。读写关注方面,报表类查询走 secondaryPreferred 分流到只读节点,交易类写入保持 majority 以保证不丢数据。

五、容量规划与分片键选择

分片集合的分片键一旦确定就无法修改,上线前必须想清楚。好的分片键要同时满足两个条件:基数足够高,写入能均匀分散。以订单集合为例,用订单号做哈希分片可以让写入均衡,但按租户查询时会变成广播查询,每个分片都要执行一次;用租户编号做范围分片便于按租户归档,却要防止大客户导致单分片过热。折中做法是以租户编号加时间的复合分片键,兼顾写入均衡与查询收敛。此外,实例存储水位建议保持在百分之七十以下,超过之后备份与扩容窗口都会明显变长,值班期间处理起来非常被动。

六、三处真实踩坑

一是唯一索引在分片集合上必须包含分片键,否则建索引会直接失败。二是用正则做前缀模糊查询却不加锚点,效果等同于全集合扫描。三是清理历史文档时用一次 deleteMany 删除百万级数据,会长时间占用锁并拖慢写入,应改为按时间字段分批删除,每批控制在五千条以内。

七、小结

DDS 的调优顺序应当是:先确定访问模式,再设计索引,然后用慢日志与 explain 验证,最后调整连接池与读写关注。把索引选择性、执行计划与连接池这三件事盯住,绝大多数线上抖动都能在半小时内定位到根因。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。