请教 mongodb 优化

2019-04-09 11:21:03 +08:00
 channg01

我的 mongo 中有 800 万条数据大概 13 个 G

我的一条查询大概是这样

查询这个人的数据分页

db.events.find({"actor.login": 'name'}).sort({"created_at": -1}).skip(200).limit(20)

一条查询要好几分钟。。

小前端不太会优化,求帮助

11850 次点击
所在节点    MongoDB
11 条回复
fox1955
2019-04-09 11:26:18 +08:00
加个索引啊老铁
EPr2hh6LADQWqRVH
2019-04-09 11:29:46 +08:00
如果你就想要结果而不想知道为什么的话,把 created_at 换成_id 目测能够好得多了
brickyang
2019-04-09 11:29:54 +08:00
skip 太多会影响性能。分页最好是每次查询的最后一条记录的 _id,下一批分页的查询用 { $gt/$lt: _id } 配合 limit。
channg01
2019-04-09 11:39:59 +08:00
@fox1955 加了 db.events.createIndex({"actor.login":1}) 这样是吧
channg01
2019-04-09 11:40:47 +08:00
@avastms 没啥感觉改变啊
@brickyang 好好好
ft28142
2019-04-09 11:48:01 +08:00
@brickyang 正解,正确的方式是不要用 skip + 索引
EPr2hh6LADQWqRVH
2019-04-09 11:52:03 +08:00
可能你这数据集还是太稀疏了,
两个方案,一个是加普通的复合索引,created_at 和 actor.login,就按这个顺序

另一个,专门索引,索引项 created_at,选项填一个 partialFilterExpression,就是你 actor.login 的查询条件,再给索引专门起一个名字

你这个情景,我感觉应该第二个方案可能更合适
rrfeng
2019-04-09 12:04:45 +08:00
加个索引就行 {actor.login:1, created_at: -1}
menyakun
2019-04-09 12:43:09 +08:00
事实上 skip 还是会要从第 1 个遍历到第 200 个,但你这个查询 skip 的数目不是很大,应该不是这个问题。一般来说 sort 肯定是比较慢的,还特别吃内存,既然 sort 的字段是 created_at,那么用_id 也行
version
2019-04-09 12:56:02 +08:00
应该是是你单个 doc 文件太大了. mongodb 再分页时候会把整个 doc 都缓存放内存..这样容易爆..
你可以分页查询只 返回_id 和 再单个主键去查询.这样会快点.
这种也适合分页超过 第 20 万以上的时候..
ScottAlone
2019-04-22 15:50:50 +08:00
@brickyang #3 如果是不是下一页,是下 N 页的话有什么办法吗...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/553277

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX