咨询大佬们一个关于 mongodb 的性能优化问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
rizon
V2EX    程序员

咨询大佬们一个关于 mongodb 的性能优化问题

  •  
  •   rizon
    othorizon 2024-03-13 16:54:08 +08:00 1862 次点击
    这是一个创建于 576 天前的主题,其中的信息可能已经有所发展或是发生改变。

    mongodb 中一个文档里有个 N 个小字段和 2 个大字段。大字段存储 base64 的图片和其他长文本内容。 在一个频繁差的查询中,我不会查询大字段,只会查询小字段,索引也只在小字段。大字段会有单独的查询使用 _id 去查询。

    然后我发现数据量大了之后,mongodb 的整体查询速度变慢了,即使我没有查询大字段,速度依然变慢了。 请问,

    1. 我需要把大字段单独拆到一个 collection 才可以吗?
    2. 大字段我必须要换成 gridfs 来读写吗?历史数据又如何迁移呢?
    3. 如果大字段拆走了,我该如何做全文搜索呢(需要搜索长文本大字段,不搜索 base64 图片)?

    谢谢大佬们

    第 1 条附言    2024-03-13 18:22:03 +08:00
    索引的事属实是我自己的问题了,感谢提醒。重新调整了索引,现在速度快了一些了。至少缓解眼前的问题了。后面我再想办法把数据拆开吧
    11 条回复    2024-03-13 21:53:51 +08:00
    nomagick
        1
    nomagick  
       2024-03-13 16:58:46 +08:00
    不需要拆字段,单文档我记得好像上限 64MB 来着

    先说说有多少内存,用没用 SSD 吧。。

    小内存机械盘,这都属于正常情况。
    zhuisui
        2
    zhuisui  
       2024-03-13 17:07:23 +08:00
    explain 呀。。。
    上来就是一顿盲目猜测
    sunny352787
        3
    sunny352787  
       2024-03-13 17:20:43 +08:00
    下回还是先说明一下运行环境吧,类似 MongoDB 的版本、内存大小、硬盘类型、数据量等等的

    按你现在的描述,基本就盲猜了,MongoDB 是内存映射方式管理文档,如果文档不在内存里那么就会触发缺页中断从硬盘读取文档数据到内存里,所以我怀疑你这边是由于内存不够大导致频繁触发缺页加载导致的速度变慢,可以先从这方面入手。

    不过大字段我这边在设计的时候确实是分开存储的,待查询数据是要即时响应而图片或其他长文本内容是可以接受异步延迟的,所以逻辑上这些就是不同的数据需要区分处理
    sunny352787
        4
    sunny352787  
       2024-03-13 17:26:17 +08:00
    另外,全文搜索别用 Mongo ,用 Elasticsearch
    yh7gdiaYW
        5
    yh7gdiaYW  
       2024-03-13 17:28:05 +08:00
    @nomagick 上限只有 16MB
    rizon
        6
    rizon  
    OP
    nbsp;  2024-03-13 17:38:27 +08:00
    @zhuisui #2 哎呀!我这好久不搞数据库了,居然连基础的排查流程都忘了。。一语惊醒啊,我这居然没想着 explain 检查一下索引命中问题。 谢谢
    最近为了搞这个项目,精神上有点疲惫,脑子都开始不灵光了。 我这就去查。


    @sunny352787 #3 非常感谢,后面我想办法把大字段迁移到独立的表吧。哎,好累,明明做这种独立项目都没什么很好的收益,但是既然做起来了,又得负责下去,看着这些问题不去优化心里也放不下啊。
    rizon
        7
    rizon  
    OP
       2024-03-13 18:27:00 +08:00
    @sunny352787 #3 2C4G 的机器,SSD 的硬盘。
    这是宝塔显示的 mongodb 的内存情况:
    可用 113MB ,已有 2180MB ,
    总内存:3400MB ,共享:2MB
    available:931MB ,buff/cache:1069/38MB

    另外,宝塔监控上,有时候磁盘 IO 的读取延迟会变的很大,超过 1000ms 。不知道为什么。
    rizon
        8
    rizon  
    OP
       2024-03-13 18:27:56 +08:00
    @rizon #7 @nomagick #1 7 楼,内存和硬盘的情况
    rizon
        9
    rizon  
    OP
       2024-03-13 18:37:57 +08:00
    @zhuisui #2 修复了索引命中问题,速度恢复正常了,感谢提醒,哈哈哈。
    nomagick
        10
    nomagick  
       2024-03-13 19:07:42 +08:00
    @rizon 数据上规模之后性能不可能太好,MongoDB 要 8G 内存才算入门,另外低端的虚机会卡硬盘 iops
    rizon
        11
    rizon  
    OP
       2024-03-13 21:53:51 +08:00
    @nomagick #10 谢谢,按看来我得单独购买 mongodb 服务才行了,自己部署终究还是不行。 买专门的存储的话,现在看价格都不便宜
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2765 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 14:44 PVG 22:44 LAX 07:44 JFK 10:44
    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