应用全线替换到 MongoDb 可能会踩到什么坑? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cevincheung
V2EX    MongoDB

应用全线替换到 MongoDb 可能会踩到什么坑?

  •  
  •   cevincheung 2014-10-13 14:19:32 +08:00 10777 次点击
    这是一个创建于 4017 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在已经知道的:

    1.查询区分大小写
    譬如用户注册,填写的用户名。email可以强制转成小写。正则查询忽略大小写又有效率问题。
    2.sharedkey设置
    一旦设置不够合理,直接导致查询速度骤降
    3.查询索引前后顺序影响查询结果
    find({'key1':'value', 'field.key2': {'$in':[1,2,3]}}) key1,field.key2查询顺序调换后查询结果排序不一样。
    35 条回复    2015-05-14 16:20:18 +08:00
    tonghuashuai
        1
    tonghuashuai  
       2014-10-13 14:51:03 +08:00   1
    4.查询不存在的 collection 时不报异常
    ovear
        2
    ovear  
       2014-10-13 14:54:38 +08:00   1
    内存爆炸。。数据损坏。。
    advancedxy
        3
    advancedxy  
       2014-10-13 14:56:03 +08:00
    5. value 是 array 的时候不要插入太多的值.. 不然就等着插入速度直线下降.
    个人不太推荐全部用 MongoDB, 还是考虑用 PostgreSQL 吧..
    yueyoum
        4
    yueyoum  
       2014-10-13 14:57:39 +08:00
    5.如果事务对你很重要,就别考虑mongodb
    6.如果你的应用没有NB到mysql+好的表设计+正确的index+合理的sql查询语句+缓存都抗不住的话,还是没必要上mongodb
    7.嵌套的document,最好是增长不迅速的。如果嵌套的document体积增长迅速,mongodb会频繁的去开辟新的,更大的空间去把包含这个嵌套document的整个document都拷贝到新开辟的空间。
    8.实在是想不到有什么必须要上mongodb的理由,mysql+redis足以
    cevincheung
        5
    cevincheung  
    OP
       2014-10-13 15:10:50 +08:00
    @yueyoum
    @advancedxy

    主要是需要mongodb的geoindex功能。又不想mysql/mongodb都存一份。。。postgis尝试了N次没成功,感觉好复杂。
    wzxjohn
        6
    wzxjohn  
       2014-10-13 15:13:03 +08:00
    9. 配置不当导致外网可以非授权访问,数据库被Dump。
    wangfengmadking
        7
    wangfengmadking  
       2014-10-13 15:52:08 +08:00
    新手使用mongo说多了都是泪,(可能由于使用不当)查询效率巨慢。所以说,如果不是业务必须的,还是绕开mongo,使用其他的吧,坑太多了
    sharebox
        8
    sharebox  
       2014-10-13 16:31:05 +08:00
    最好不要只用一种数据库....

    综合考虑,选最合适的组合。
    yanze0613
        9
    yanze0613  
       2014-10-13 17:22:41 +08:00
    定时刷新数据到mysql,mongo单纯做内存数据库,感觉会比直接用好
    willwen
        10
    willwen  
       2014-10-13 17:26:12 +08:00 via iPhone
    爆存,爆硬
    TimLang
        11
    TimLang  
       2014-10-13 17:30:41 +08:00
    做索引一定要加{backgoround:1}。。
    pythoner
        12
    pythoner  
       2014-10-13 18:15:50 +08:00
    10. 单机要扛不住了才想起做sharding
    lqs
        13
    lqs  
       2014-10-13 18:20:39 +08:00
    11. mongodb的geoindex当数据大了会特别慢。
    menway
    14
    menway  
       2014-10-13 19:21:25 +08:00
    12. 字段名称不能包含.和$
    13. 跨表查询
    est
        15
    est  
       2014-10-13 19:37:12 +08:00
    mongodb的索引必须全部放在内存中。如果索引大小超过内存,等着哭吧。。。
    kankana
        16
    kankana  
       2014-10-13 19:42:51 +08:00
    @yueyoum
    那个scheme不固定可以算一个使用理由不?
    你们都说得好恐怖啊... 我也是第一次用.
    TangMonk
        17
    TangMonk  
       2014-10-13 20:55:01 +08:00
    mysql好像有Spatial search啊
    vus520
        18
    vus520  
       2014-10-13 22:48:30 +08:00
    为什么你们都不提聚合查询真的好复杂~
    codeframe
        19
    codeframe  
       2014-10-13 23:08:18 +08:00
    查询结果集有个 16M 的限制;另外就是没法做多表的 join 操作;还有就是一旦数据库写满磁盘后,直接删数据是不会腾出硬盘空间的。
    fasling
        20
    fasling  
       2014-10-13 23:22:58 +08:00
    性能。
    我不是很懂,但据说数据量一大就慢。隔壁组还专门弄了个mysql来加速。
    liuchang0812
        21
    liuchang0812  
       2014-10-13 23:37:55 +08:00
    mongodb本来就是内存性的NoSQL数据库。。。上面说定期dump到mysql的。。。。你们完全可以用leveldb。。。。
    Cadina
        22
    Cadina  
       2014-10-14 01:50:46 +08:00
    可以试试用rethinkdb替代mongo
    cevincheung
        23
    cevincheung  
    OP
       2014-10-14 02:01:21 +08:00
    @Cadina 支持geo?
    dcoder
        24
    dcoder  
       2014-10-14 08:35:08 +08:00
    我看来,楼主说的 1,2,3 都不是坑呢
    cevincheung
        25
    cevincheung  
    OP
       2014-10-14 09:32:07 +08:00
    @TangMonk 感觉略坑,效率远不如mongodb
    mengzhuo
        26
    mengzhuo  
       2014-10-14 09:36:37 +08:00
    应该看应用场景吧

    游戏+mongodb/Redis天生一对
    MasterYoda
        27
    MasterYoda  
       2014-10-14 10:16:46 +08:00
    @yueyoum 看场景吧,LBS上mongodb就很正常了。但确实这东西比 MySQL + Redis 坑多。
    MasterYoda
        28
    MasterYoda  
       2014-10-14 10:19:16 +08:00
    @liuchang0812 leveldb直接用还是有点不爽啊。而且读多写少的话上也不合适。
    yueyoum
        29
    yueyoum  
       2014-10-14 11:08:58 +08:00
    @cevincheung
    @MasterYoda

    postgresql 支持 point 数据类型,也就是 可以直接存储 (1.23, 45.09) 这样的数据。
    刚好可以用作经纬度存储。

    配合 postgis 貌似也挺方便, 虽然我没弄过…………
    yueyoum
        30
    yueyoum  
       2014-10-14 11:12:10 +08:00
    @kankana

    确实 scheme 不固定,我在项目中也是感受到这点的方便,
    但感觉 postgresql 支持的json字段, 也是有这个好处啊。


    所以如果是要在新项目中,mongodb 和 postgresql 都可以选择的话,
    我个人倾向还是用 postgresql
    cevincheung
        31
    cevincheung  
    OP
       2014-10-14 12:23:08 +08:00
    @yueyoum postgis忒麻烦,尝试数次失败已经放弃了,用pgsql替代mysql,那我倒放心。

    现在正在尝试Solr GeoDist
    Cadina
        32
    Cadina  
       2014-11-27 17:12:59 +08:00
    @cevincheung 新版支持了
    cevincheung
        33
    cevincheung  
    OP
       2014-11-28 02:52:24 +08:00
    @Cadina 支持神马
    mathgl
        34
    mathgl  
       2014-12-08 22:41:40 +08:00
    一直用tokumx。 相当满意
    zlandjj
        35
    zlandjj  
       2015-05-14 16:20:18 +08:00
    @cevincheung redis貌似有个插件还是petch支持geo
    关于     帮助文档     自助推广系统     博客     a href="/help/api" class="dark" target="_self">API     FAQ     Solana     1080 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:55 PVG 01:55 LAX 10:55 JFK 13:55
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86