首页 > 解决方案 > 如何用 MySQL 分块检索一行数据

问题描述

我们的旧系统过去常常将大量二进制数据直接放入数据库,例如(我知道这是糟糕的设计,但兼容性是第一位的):

CREATE TABLE data_table (
  id int PRIMARY KEY AUTO_INCREMENT,
  data longblob
);

运行时,系统应该从数据库中检索一行数据(使用MySQL-python)并对数据做一些事情:

# simplified, removed some error-handling logic
connection = MySQLdb.connect(host='xxx', port='xxx', user='xxx', passwd='xxx', db='xxx')
with connection.cursor(cursorclass=MySQLdb.cursors.DictCursor) as cursor:
    cursor.execute('SELECT data FROM data_table WHERE id = %s', (123,))
    data = cursor.fetchall()[0]['data']
    # do some stuff with the data

问题来了:单行数据可能非常大(>1GB),而系统运行在内存限制为1GB的容器中,所以即使取单行也会导致OOM(Out Of Memory)错误,系统崩溃。

有没有办法将一行中的数据直接流式传输到外部存储,或者以块的形式检索数据以避免 OOM 错误?提前致谢。

编辑:我们使用的是 MySQL 5.7,但如果对解决此问题有帮助,升级 MySQL 版本也是可以接受的。

标签: pythonmysqlmysql-python

解决方案


推荐阅读