我给表建了一个 {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} 这个复合的索引,很奇怪?
1
snBDX1b0jJM4ogKd 2019-08-13 00:27:06 +08:00 via Android
因为你查询的时候,nickname 是正则,没法走索引
|
2
salamanderMH OP @cs010 但也是最前缀匹配的
|
3
snBDX1b0jJM4ogKd 2019-08-13 10:15:37 +08:00 via Android
@salamanderMH 用正则应该走全表扫描,怎么还会前缀匹配。你把正则换了,肯定就走索引了啊
|
4
salamanderMH OP @cs010 MySQL 中用 LIKE 'name%'是可以用到索引的。
|
5
snBDX1b0jJM4ogKd 2019-08-13 14:18:34 +08:00
@salamanderMH 抱歉,我先前回答并不准确,你不妨贴一下你的执行计划和 mongo 版本
|
6
salamanderMH OP @cs010 我把语句改成了
collection.find( nickname: { '$regex': /^${name}.*/ }).sort({nickname:1, follower_count: -1}).limit(20) 就可以命中索引了 |