V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pmispig
V2EX  ›  程序员

请问关于 mysql longblob 字段类型 占用内存问题

  •  
  •   pmispig · 2020-05-21 16:06:47 +08:00 · 1117 次点击
    这是一个创建于 1639 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个表,里面有一个 longblob 字段,单个字段数据大小可能有几百 M 到 1G 以上,客户端多个线程查询或者写入多行的时候,会导致内存使用剧增,感觉是把整个 longblob 数据载入内存了。
    请问这个怎么优化,看到官方有提到 max_allowed_packet,感觉这个没什么意义,因为你不增大它,就会报错,增大了又会让整个 buffer 载入内存缓冲区。官方原文"The packet message buffer is initialized to net_buffer_length bytes, but can grow up to max_allowed_packet bytes when needed"
    请问有什么办法限制吗。
    别说把数据用其他方式存了,没办法,只能从 mysql 本身着手,尴尬。

    6 条回复    2020-05-21 16:45:14 +08:00
    sujin190
        1
    sujin190  
       2020-05-21 16:29:29 +08:00
    似乎 mysql 应该不支持单行流式传输吧,mysql 的协议也不支持流式传输吧,而且这样显然事务也没法做了,所以你这不太符合 mysql 使用方式估计很难找到靠谱解决方案了

    实在不行或许可以考虑分片,整个大数据分成 16K 的小段,每小段编个码放到一行里,写入的时候一行一行写也间接实现了流式传输写入,读取的时候也可以用 unbuffer 模式可以很好的支持流式传输

    话说你这不分片,就算 mysql 不爆内存,你应用服务器也得爆吧,你这是存的视频数据么?认值说还真没人这么干,太低效了
    rogwan
        2
    rogwan  
       2020-05-21 16:32:22 +08:00 via iPhone
    超过几百 M 的文件存 MySQL 里,这个场景本身就有问题。应该取出来当文件存。
    pmispig
        3
    pmispig  
    OP
       2020-05-21 16:34:53 +08:00
    @sujin190 哎,程序那边改不了,系统是买的,设计的就很垃圾,没办法。。。
    我也是第一次见这种牛逼操作
    pmispig
        4
    pmispig  
    OP
       2020-05-21 16:35:25 +08:00
    @rogwan 是有问题,但是没法改
    sujin190
        5
    sujin190  
       2020-05-21 16:43:02 +08:00
    @pmispig #3 那估计你很难找到解决方案了,毕竟无论是 mysql 数据库和 mysql 协议自身都没有加入流式传输模式

    不能改程序的话估计靠谱的方案还是加内存就是了,现在内存也不怎么值钱,使用量少不想多花钱就多加点交换空间死撑,量大的话就只能多花钱买内存了,然后控制着并发写读数量,只要不崩溃就是了
    pmispig
        6
    pmispig  
    OP
       2020-05-21 16:45:14 +08:00
    @sujin190 哦了,多谢指点~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2739 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 05:27 · PVG 13:27 · LAX 21:27 · JFK 00:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.