我有一张有 1 亿行的表。我想一次处理一行,没有特定的顺序。我不想一次将所有数据加载到内存中,我想要立即获得部分结果。为了消除我正在使用的 ORM 框架的潜在问题,我想我会测试我使用命令行客户端立即获得部分结果的能力mysql
,如下所示:
mysql> select id from my_table \G
但是mysql
客户端在那里等待了 75 秒,没有打印任何内容,最终大小增加到 5.8 GB(由 报告top
),然后开始打印结果。在打印结果时,客户端进程的内存消耗mysql
没有改变(它保持在 5.8 GB)。
在前 75 秒内,使用第二个mysql
会话,我可以看到我的查询处于sending data
状态。当客户端开始打印结果时,进程命令(如报告的show processlist
从更改Query
为Sleep
.
为什么mysql
交互式客户端要等到所有结果都进来才打印结果?这极大地浪费了 RAM,并且无法立即产生部分结果。
--quick
使用该选项调用 MySQL 客户端。见https://dev.mysql.com/doc/refman/8.0/en/mysql-command-options.html#option_mysql_quick
本文档暗示了默认将结果存储在客户端中的原因。如果交互式客户端被挂起(例如使用 Ctrl-Z 作业控制),MySQL 服务器必须使用资源来保持结果集处于活动状态。
您应该考虑不要在对交互式客户端的单个查询中获取 1 亿行。