MongoDB首次查询很慢的问题

xiaopan588128 2017-04-20 09:37:31
我在项目中遇到一个MongoDB的问题,好多天了还是没能得到解决,希望得到大牛的指点。
具体问题是:长时间不访问数据库的情况下,第一次查询数据库所需的时间很长,但是之后的查询就会很快。
具体情况:
①整个数据库大小大概在1.9TB左右;
②我查询的collection的数据大致为700万条;
③我查询一次得到的数据为23万条左右;
④服务器内存为120GB;
⑤已按照查询条件建立了索引,索引数据大小为600MB左右;
⑥第一次查询所用时间20s左右,之后的查询在1s以内。
目前考虑的原因:
由于MongoDB不负责内存的管理,所以,当长时间未访问数据库时,内存中的数据即为冷数据,操作系统的内存管理程序就会将这部分冷数据释放,导致下次查询时,需要重新加载数据到内存,所以比较费时。目前,不能够确定是加载索引比较费时,还是加载数据比较费时。MongoDB虽然提供了touch命令(该命令能够指定将某个collection的索引数据或者用户数据加载到内存中),但是我使用的是WiredTiger存储引擎,该命令不支持该存储引擎。
需要得到的帮助:
①是不是以上原因导致的该问题?
②如果是该原因导致的,如何确定是加载索引费时还是加载数据费时?
③有什么比较好的解决方案么?

注:由于该collection最大会达到25GB左右,而且整个数据库还有其他很多collection,所以将该collection的所有数据存储到内存是不可取的。如果能够确认是加载索引费时的话,倒是可以考虑定期将索引加载到内存,但是对于WiredTiger存储引擎,没有支持该功能的方法,这又是一个问题。
...全文
3455 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2019-09-04
  • 打赏
  • 举报
回复
首次访问一定是要走磁盘的,如果磁盘IO慢,则这个过程会很慢,缓存包含两层,一层是操作系统本身的缓存,另一层是 WiredTiger 的内部缓存,在这一层,数据还会被解压缩(默认设置下,数据是压缩存储的)
所以磁盘读取/解压缩,这些都会导致首次查询慢
索引的问题应该不在,它的数据量不大,消耗的磁盘IO不会太大,索引默认是前缀压缩,这个在 WiredTiger 内部缓存中也不需要解压缩的
确认的方法:你可以建立一个同样的集合,集合中只包含索引数据,对比一下这个集合与原始集合的首次查询性能
qq_20996981 2019-09-02
  • 打赏
  • 举报
回复
请问这个mongodb首次查询慢的问题解决了吗?
qq279788 2019-07-18
  • 打赏
  • 举报
回复
我目前也遇到这个问题,使用explain查询语句发现首次查询 需要saveState和restoreState 大量数据,第二次这个数据就会小很多,请问楼主这个问题解决了吗?
维秀斯丢丢 2018-05-02
  • 打赏
  • 举报
回复
每天来个预热查询吧。
  • 打赏
  • 举报
回复
系统启动开始自动进行一次随机一个数据的查询不行吗?
maxx 2018-04-27
  • 打赏
  • 举报
回复
mark一下 我也发现这个问题了 因为我是web访问的数据所以我一直以为是浏览器的问题 看来是mongo的问题
a532041020 2017-12-04
  • 打赏
  • 举报
回复
楼主解决了吗,同样遇到类似的问题,时间长不访问第一次访问速度很慢。然后再访问速度就正常了
rucypli 2017-04-27
  • 打赏
  • 举报
回复
如果对这么大数据必须要这么强的实时性 可以考虑用内存引擎替换wiredtiger

1,748

社区成员

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

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