• #29 楼 @windstill 用传统坐标试过的。 之前就是传统坐标。 也不是组合索引, 当然组合和非组合索引都试过。

    mongodb version 2.6.x

    stackoverflow 基本被我翻烂了。:)

    所以我现在估计并不是单纯的索引问题,因为这个 collection 被 insert, update 也很频繁,也可能是其他原因引起 v2.6 下都是库级锁,所以很蛋疼。

  • #25 楼 @windstill 索引不在 coordinates 上,在 location 字段上。 如下:

    {
            "v" : 1,
            "key" : {
                "location" : "2dsphere",
            },
            "name" : "location_2dsphere,
            "ns" : "db.example",
            "2dsphereIndexVersion" : 2
        }
    
  • 我的总数据量200w左右。 nearSphere 一个坐标的总量在42w左右, 为啥我查询的时间要 2s(2000ms) 多呢? 下面是具体的数据:

    数据存储的格式如下:

    {
    "postid":NumberLong(97040),
    "accountid":NumberLong(348670),
    "location":{
        "type":"Point",
        "coordinates":[
            112.56531,
            32.425657
        ]
    },
    "type":NumberLong(1),
    "countspreads":NumberLong(6),
    "countavailablespreads":NumberLong(6),
    "timestamp":NumberLong(1428131578)
    }
    

    ** 索引在 location 字段上面 **

    {
            "v" : 1,
            "key" : {
                "location" : "2dsphere"
            },
            "name" : "location_2dsphere",
            "2dsphereIndexVersion" : 2
        }
    

    ** 查询语句 **

    db.example.find({"location":{"$nearSphere":{"$geometry":{"type":"Point","coordinates":[113.547821,22.18648]},"$maxDistance":50000, "$minDistance":0}}}).explain()
    

    结果如下

    {
        "cursor" : "S2NearCursor",
        "isMultiKey" : false,
        "n" : 145255,
        "nscannedObjects" : 1290016,
        "nscanned" : 1290016,
        "nscannedObjectsAllPlans" : 1290016,
        "nscannedAllPlans" : 1290016,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 4087,
        "indexBounds" : {
    
        },
        "server" : "DB-SH-01:27017",
        "filterSet" : false
    }
    

    注意我的 $maxDistance 很大, 根据 explain 结果看,扫描了 100w+ 的记录,查询时间预计是 4087ms。 如果缩小 $maxDistance 到 500, 结果如下:

    {
        "cursor" : "S2NearCursor",
        "isMultiKey" : false,
        "n" : 21445,
        "nscannedObjects" : 102965,
        "nscanned" : 102965,
        "nscannedObjectsAllPlans" : 102965,
        "nscannedAllPlans" : 102965,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 634,
        "indexBounds" : {
    
        },
        "server" : "DB-SH-01:27017",
        "filterSet" : false
    }
    

    这里看到扫描的记录数是 10w+, 预计时间是 634ms 依然很大。 后面我记录把$maxDistance缩小到0.0001,扫描的记录数也在 8w 左右,而时间徘徊在 600ms 左右。 无法再减少。 这个时间是完全无法接受的。

    不知道楼主如何测试出来100w记录能够在30ms左右的

  • 路过,看美女

  • 这个帖子应该移动到 “瞎扯谈” 里面,还要麻烦版主了

  • #41 楼 @karma 说实话,我这个主题问的都很主观化,所以习惯问题真要看个人。 关于你的 1,2,4 几个问题,举个简单例子: 每行结束的时候,会情不自禁的敲上一个;(分号) 吗? if 后面会情不自禁的敲上一个{吗? 呵呵 当然习惯是一个过程,再多学几天,我就习惯了,呵呵。

    3 - 对于基础语法问题,恐怕要扯到好坏这个问题上,确实有难度, 有的人就是喜欢 pascal 语法,但有人就是喜欢 C 系列的语法, 或许还真有人喜欢用机器码,呵呵,难讲。

    5 - 这个问题 - google 一直是我的习惯。

    我承认发这个帖子,或者发这个主题的帖子是草率的, 确实这个主题会引起很多口水仗。

    6 - 谢谢,也希望 Ruby 能给你带来快乐和财富。

    最后, 我之所以说 “ruby 语法有点乱” -- 其实是因为一个想法: ruby 基础语法既有 c 的影子,又有 pascal 的影子.

    当然,如果你有时间,你可以去看看 delphi, vb.net, c#/java/php, 然后试着用他们写个项目

    over

  • #4 楼 @Rei 谢谢,非常好

  • 感谢各位的倾力回复啊, 收益良多,谢谢。

  • 镐头书 Ruby1.8 有中文, 1.9 有英文版