V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
salamanderMH
V2EX  ›  问与答

MongoDB 复合索引的一个问题?

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