MongoDB 复合索引的一个问题?

2019-08-12 16:12:01 +08:00
 salamanderMH

问题

我给表建了一个 {nickname: 1, follower_count: -1} 的索引,follower_count 是粉丝数,然后想左前缀查询用户的时候按粉丝数倒序出结果,这是语句

collection.find( nickname: { '$regex': /^${name}.*/ }).sort({follower_count: -1}).limit(20)

看执行计划,用的索引是follower_count的单列索引,而没用 {nickname: 1, follower_count: -1} 这个复合的索引,很奇怪?

1011 次点击
所在节点    问与答
6 条回复
cs010
2019-08-13 00:27:06 +08:00
因为你查询的时候,nickname 是正则,没法走索引
salamanderMH
2019-08-13 09:42:20 +08:00
@cs010 但也是最前缀匹配的
cs010
2019-08-13 10:15:37 +08:00
@salamanderMH 用正则应该走全表扫描,怎么还会前缀匹配。你把正则换了,肯定就走索引了啊
salamanderMH
2019-08-13 10:40:28 +08:00
@cs010 MySQL 中用 LIKE 'name%'是可以用到索引的。
cs010
2019-08-13 14:18:34 +08:00
@salamanderMH 抱歉,我先前回答并不准确,你不妨贴一下你的执行计划和 mongo 版本
salamanderMH
2019-08-14 15:13:11 +08:00
@cs010 我把语句改成了
collection.find( nickname: { '$regex': /^${name}.*/ }).sort({nickname:1, follower_count: -1}).limit(20)
就可以命中索引了

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

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

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

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

© 2021 V2EX