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

2020-05-21 16:06:47 +08:00
 pmispig

我有一个表,里面有一个 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 本身着手,尴尬。

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

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

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

不能改程序的话估计靠谱的方案还是加内存就是了,现在内存也不怎么值钱,使用量少不想多花钱就多加点交换空间死撑,量大的话就只能多花钱买内存了,然后控制着并发写读数量,只要不崩溃就是了
pmispig
2020-05-21 16:45:14 +08:00
@sujin190 哦了,多谢指点~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/674047

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX