MONGODB条件查询效率低

若传祺 2016-02-05 09:27:17
各位前辈好,最近我们的项目在使用mongodb作为数据存储,目前数据库平均每秒入库约单表3000条(5MB)每秒,而且每个表(collections)有十几个属性(包括时间,和一些业务相关的属性),当单表(collections)数据达到1t左右时候时测试对表中多个属性对数据进行组合条件查询时出现查询时间超长(单次查询开销在一小时以上)的情况,与查询业务直接的索引已经建立了,数据存储由三台大容量服务器以sharding模式配置,分片的键选择为入库时间这一属性,各个表也建立了TTL索引以保证自动移除较久远的数据。不知道有没有大神有过优化过这一问题的经验,学生在这先谢过各位了。
...全文
1623 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
eshujiushiwo 2016-03-16
  • 打赏
  • 举报
回复
首先是这样的,shard key是入库时间。 可以理解为单调递增的。 那么用该字段的条件查询很有可能造成热点查询,即,只用到了其中一个shard分片。 另外。看描述是mmap? 楼上说的很对,换WT吧,并发与压缩比都会让你爽的 哈哈哈
rucypli 2016-02-24
  • 打赏
  • 举报
回复
那更换成3.0的wiredtiger吧,真的有惊喜:) 不过单次查询开销在一小时以上确实有点不对劲啊索引建立的不合理?
若传祺 2016-02-23
  • 打赏
  • 举报
回复
引用 1 楼 rucypli 的回复:
如果是mmp引擎 用mongostat看看是否因为内存不够导致page error过多
额 我们有一直盯着mongostat,确实在执行查询的时候faults的值会跳到300+,我们的三台服务器内存均为100G
rucypli 2016-02-18
  • 打赏
  • 举报
回复
如果是mmp引擎 用mongostat看看是否因为内存不够导致page error过多
最近重构并优化了一套后端服务的代码: 1. 设计并开发高效的C++对象池算法,时间复杂度为 O(1) 在整个重构框架中,对象池是负责管理内存的底层基本模块 2. 利用命令模式的思想开发 Redis 子模块 抽象出方便高效的接口提供给上层程序员使用 3. 利用组合模式和装饰模式的思想开发 MongoDB 数据库查询条件装饰器 将查询条件和数据库 MongodbModule 数据模型进行解耦合 4. 抽象出一套 MongoDB Module 结果集接口 通过模板和特化技术实现 string/int 等不同索引类型的结果集 5. 开发 AbstractMongodbModule 类处理通用的 MongoDB 数据库表数据操作 数据库中不同的表都有自己的 AbstractMongodbModule 子类对应 6. 用 Perl 开发自动代码生成器,上层程序员对照数据库表结构写 .tmpl 配置文件, 自动生成该数据库表的 MongodbModule 子类,减轻程序员新增表时的工作量 7. 结合 Redis 模块和 MongoDB 模块,开发 HierarchicalModule 分层数据模型 构造一个 Redis 缓存层 + MongoDB 持久层的后台 Server 架构 并通过简单方便的接口供上层程序员使用,具体的数据分层处理对上层程序员是黑盒的 8. 设计并开发整套缓存层使用的 KEY 规则,方便缓存更新 结合公司的数据订阅系统进行 Redis缓存层 + MongoDB 持久层数据更新功能 9. 重构后的分层数据架构比原有接口效率提高 5 - 400 倍(返回数据记录条数从 150 - 5 条) 绝大部分时间后端接口需要获取记录个数在 50 以内,所以效率提升在 100 倍左右

1,747

社区成员

发帖
与我相关
我的任务
社区描述
MongoDB相关内容讨论区
社区管理员
  • MongoDB社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧