gpt4 book ai didi

mysql - MySQL golang 驱动程序中的无缓冲结果集

转载 作者:IT王子 更新时间:2023-10-29 01:26:39 25 4
gpt4 key购买 nike

我有一个大型查询,我想使用 Go MySQL driver 逐行处理结果.查询非常简单,但会返回大量行。

我在 C-API 级别看到了 mysql_use_result()mysqli_store_result()。是否有通过 TCP 连接执行无缓冲查询的等效方法,例如 Go MySQL 驱动程序所使用的方法?

最佳答案

数据库客户端库中缓冲/非缓冲查询的概念有点误导,因为实际上,缓冲可能发生在多个级别。一般来说(即不是特定于 Go,也不是特定于 MySQL),您有不同种类的缓冲区。

  • TCP 套接字缓冲区。内核将一个通信缓冲区关联到每个套接字。默认情况下,此缓冲区的大小是动态的,由内核参数控制。一些客户可以更改这些默认值以获得更多控制和优化。此缓冲区的用途是调节设备队列中的流量,并最终减少网络上的数据包数量。

  • 通信缓冲区。面向数据库的协议(protocol)通常基于成帧协议(protocol),这意味着帧被定义为分隔 TCP 流中的逻辑数据包。套接字缓冲区不保证可以读取完整的逻辑数据包(帧)。因此,需要额外的通信缓冲区来确保帧在处理时是完整的。它们还可以帮助减少系统调用的数量。这些缓冲区由数据库客户端库的低级通信机制管理。

  • 行缓冲区。一些数据库客户端选择将从服务器读取的所有行保存在内存中,并让应用程序代码浏览相应的数据结构。例如,PostgreSQL C 客户端 (libpq) 就是这样做的。 MySQL C 客户端将选择权留给开发人员(通过调用 mysql_use_result 或 mysql_store_result)。

反正你说的Go驱动不是基于MySQL C客户端的(是纯Go驱动)。它仅使用前两种缓冲区(套接字和通信缓冲区)。不提供行级缓冲。

每个 MySQL 连接有一个通信缓冲区。它的大小是 4 KB 的倍数。如果帧很大,它将动态增长。在 MySQL 协议(protocol)中,每一行都作为一个单独的数据包(在一个帧中)发送,因此通信缓冲区的大小直接与客户端接收/发送的最大行有关。

结果是您可以运行返回大量行的查询而不会使内存饱和,并且仍然具有良好的套接字性能。有了这个驱动程序,无论查询如何,缓冲对开发人员来说都不再是问题。

关于mysql - MySQL golang 驱动程序中的无缓冲结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29023902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com