【问题标题】:I want PHP to buffer my MySQL results client-side AND I want to begin using the results immediately我希望 PHP 在客户端缓冲我的 MySQL 结果并且我想立即开始使用结果
【发布时间】:2015-03-11 03:13:12
【问题描述】:

MySQL 无缓冲查询真的完全不使用 PHP 缓冲吗?在 PHP 访问数据之前,缓冲查询真的缓冲了整个结果集吗?

根据我阅读的有关 MySQL 缓冲查询的内容,这不是我想要的,因为我想立即开始处理结果,而不必在开始之前等待所有结果都被缓冲。但是从我所读到的关于无缓冲查询的内容来看,这也不是我想要的,因为我确实希望它缓冲客户端上的结果,这样 MySQL 就不会被搁置更长的时间,我只是不在我开始处理结果之前,不希望它等待结果完全缓冲。所以请帮助我理解。

在允许 PHP 开始使用结果之前,MySQL/PHP 中的缓冲查询真的会缓冲整个结果集吗?并且无缓冲查询真的完全不使用缓冲,以便 MySQL 服务器在将下一个结果发送到客户端之前不断等待 PHP 请求下一个结果吗?如果这是真的,为什么没有办法立即开始使用结果,但仍然缓冲结果以减轻 MySQL 的负载?

我的 MySQL 服务器是具有许多不同客户端节点的共享服务器。所以在客户端不使用缓冲是没有意义的。但是查询很大,因此它们不需要等待返回整个结果集即可开始使用结果。

那么我理解对了吗?没有办法在这里做我想做的事吗?没有办法以实际的方式处理这个问题?

【问题讨论】:

  • php.net/manual/en/mysqlinfo.concepts.buffering.php 99.9% 的人对缓冲默认值没有任何问题。你想多了。你必须做一些独特的事情才能不坚持默认
  • 大多数人不会无限制地查询数千行。如果我只是期待一些结果,那么在能够继续之前等待整个结果集的默认设置就可以了。我确信我所做的并不是独一无二的,但这就是为什么我认为这是一个值得提出的问题。
  • 如果您有具体的场景,请提供,S.O 是针对具体问题的。
  • 为了它的价值,我查询了数千(可能是 100k)的缓冲行,当数据库服务器在同一个网络上时,返回几乎是即时的,也许你应该对其进行基准测试。
  • 我很具体。 1 MySQL 服务器,以及许多负载平衡的虚拟 PHP 节点(在同一网络上),它们正在运行大型查询(数千行),并且应该能够立即开始对该数据进行操作,而无需等待整个数据缓冲。从您的回复看来,您建议使用缓冲查询,因为等待时间足够小,不值得担心。我将对其进行基准测试并查看。

标签: php mysql buffered unbuffered


【解决方案1】:

我确实希望它在客户端缓冲结果,这样 MySQL 就不会被耽搁的时间超过它必须的时间

MySQL 非常有能力处理同时连接——实际上,来自这些同时连接的同时操作。也就是说,几乎是 RDBMS 的主要存在理由之一。

为了防止同时操作作用于相同的底层数据时发生冲突,MySQL 会不时“锁定”数据库的部分内容以独占使用一个连接;但是,一旦它开始向客户端传输结果,为执行该语句而获得的任何锁都将已被释放。因此,MySQL 将永远被不立即将整个结果集加载到缓冲区中的客户端“阻止”。

那么,关于您的具体问题:

  1. 在允许 PHP 开始使用结果之前,MySQL/PHP 中的缓冲查询真的会缓冲整个结果集吗?

    是的。

  2. 而且,无缓冲查询真的完全不使用缓冲,因此 MySQL 服务器在将下一个结果发送到客户端之前一直在等待 PHP 请求下一个结果?

    差不多。 MySQL 客户端库(C 语言)将执行一些缓冲,但只是为了有效地执行网络操作。

  3. 如果这是真的,为什么没有办法立即开始使用结果,但仍然缓冲结果以减轻 MySQL 的负载?

    无缓冲查询对 MySQL 的“负载”非常小——当然,它必须保持连接打开并将结果集保存在内存中,但这很少是一个非常大的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    相关资源
    最近更新 更多