salamanderMH
V2EX  ›  问与答

MongoDB 复合索引的一个问题?

  •  
  •   salamanderMH · Aug 12, 2019 · 1724 views
    This topic created in 2645 days ago, the information mentioned may be changed or developed.

    问题

    我给表建了一个 {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} 这个复合的索引,很奇怪?

    6 replies  •  2019-08-14 15:13:11 +08:00
    snBDX1b0jJM4ogKd
    snBDX1b0jJM4ogKd
    Aug 13, 2019 via Android
    1
    因为你查询的时候,nickname 是正则,没法走索引
    salamanderMH
    salamanderMH
    OP
    Aug 13, 2019
    2
    @cs010 但也是最前缀匹配的
    snBDX1b0jJM4ogKd
    snBDX1b0jJM4ogKd
    Aug 13, 2019 via Android
    3
    @salamanderMH 用正则应该走全表扫描,怎么还会前缀匹配。你把正则换了,肯定就走索引了啊
    salamanderMH
    salamanderMH
    OP
    Aug 13, 2019
    4
    @cs010 MySQL 中用 LIKE 'name%'是可以用到索引的。
    snBDX1b0jJM4ogKd
    snBDX1b0jJM4ogKd
    Aug 13, 2019
    5
    @salamanderMH 抱歉,我先前回答并不准确,你不妨贴一下你的执行计划和 mongo 版本
    salamanderMH
    salamanderMH
    OP
    Aug 14, 2019
    6
    @cs010 我把语句改成了
    collection.find( nickname: { '$regex': /^${name}.*/ }).sort({nickname:1, follower_count: -1}).limit(20)
    就可以命中索引了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4179 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:58 · PVG 09:58 · LAX 17:58 · JFK 20:58
    ♥ Do have faith in what you're doing.