【问题标题】:maximum query length in mysqli_querymysqli_query 中的最大查询长度
【发布时间】:2012-10-27 15:58:22
【问题描述】:

如何确定 PHP 中函数 mysqli_multi_query(或 mysqli_query)接收的最大 $query 参数? 我有一个 php 程序,它生成一个由 UPDATE sql 命令组成的大字符串,用 ';' 分隔问题是,如果该字符串超过一定长度,mysqli_query 会生成一个错误,如“MySQL 服务器已消失”。我注意到这个长度似乎在 1MB 左右,但我该如何探测它以确保我永远不会超过这个长度?

脚本需要在大约 25 个字段上运行大约 7000 次更新。一次执行一个更新被证明非常慢,连接多个更新运行得更快。

是否有可能更快地运行多个查询?

感谢您的任何建议!

【问题讨论】:

  • 我认为不是字符串的长度,而是执行所有语句所需的时间。
  • 如果我在 phpmyadmin 中运行它,它会在 3 秒内运行
  • 请再次阅读我的回答。在你接受我的帖子后,我添加了一些关于“多个查询更快”的内容。

标签: php mysqli-multi-query


【解决方案1】:

你应该看看 MySQL 错误日志。

如果您无权访问机器(托管等),您可以向您的管理员或帮助台询问该日志。

MySQL 支持非常大的查询。我不确定是否有任何限制,但是当您使用网络时 - 您可能会遇到 数据包大小 的问题。

您可以在 MySQL 配置中查看--max_allowed_packet,并尝试设置更大的数据包大小。我不确定默认配置,但它可能是 1MB,这对于一次获取 7000 次更新的查询可能太小了。

MySQL 可能需要更多 RAM 来处理这样的查询。

如果您无法重新配置 MySQL,则必须以某种方式将大查询拆分为较小的查询。

您也可以阅读以下内容了解更多信息:

devshed - MySQL server has gone away

你问:

是否有可能更快地运行多个查询?

这个问题没有简单的答案。这取决于查询、数据库架构等。

在大多数情况下,增加配置文件中的 MySQL 缓存大小可能会有所帮助,因为数据库引擎将在 RAM 内存上运行,而不是在硬盘上运行。当使用大缓存时 - 有时第一个大查询可能会更慢,因为数据尚未加载到 RAM 中,但当它最终加载时 - 需要大量读/写操作的查询会运行得更快。

稍后添加: 我假设您的数据处理需要 php deserialize() 函数,这可能很难在纯 SQL 中实现,而您必须在 PHP 中完成 :) 如果您可以访问服务器控制台,您可以创建调用 PHP 的 cron (linux sheduler) 作业夜间从 shell 编写脚本。

稍后添加 在 cmets 讨论之后,我又有了一个想法。您可以从 phpmyadmin 制作完整的数据库或一张表备份,下载它,在家庭计算机上恢复数据(在 Windows 上,您可以使用 XAMPP、WAMP 服务器)。在您的家用计算机上,您可以运行 mysql.exe 并在本地处理数据。

【讨论】:

  • 我想记录对站点的访问,我使用了一个表,其中包含第一个字段,如 ID、get、post、server、cookie。我在访问时将序列化的变量存储在那些字段中。当我访问日志时,我反序列化(此时我运行这 7000 个更新)这些字段并将它们写入辅助字段,如 server_HTTP_REFERER、server_REMOTE_IP 或 post_page。我想导出表格并在电子表格中进行分析
  • 我明白了。你能重新配置那个服务器吗?
  • 我正在考虑尝试将更新保存在一个大 SQL 文件中并使用 mysql 命令运行它,但我认为我不能从 php 运行命令行。
  • ...我假设 - 您无法在插入期间处理该数据,因为这可能会破坏网站性能,对吧?
  • 我认为您应该将它们分组为 10-50 个查询组,并在某个循环中一个接一个地运行它们。这需要一些时间,但日志分析不是频繁操作,您可以在睡眠前运行它:) 其他选项是在家用计算机上备份和还原数据库(正如我在回答中所写的那样)。
【解决方案2】:

我在 INSERT 语句中发现了 16 个字段/值对的限制。超过这个数字,我得到一个“禁止”错误。我在工作语句中的总 INSERT 语句长度为 392 个字符。

【讨论】:

    【解决方案3】:

    使用 for 循环完成任何大量工作,只需使用常规 mysqli_query。我收到了超过 16000 个查询。 php.ini 文件中的某些内容也必须更改。发布 mb 大小需要更改。如果您发送很多字符,请尽可能大。如果您发送许多不同的变量,也应该更改 var input max。使 php 内存大小更大。确保在运行查询时不会耗尽系统内存。如果您做对了所有事情,您可以发送超过 20000 个查询。将 php 内存设置为至少 256mb。如果您发送大量查询,有时您可能需要将超时时间从 30 和 60 增加到 200 或更高。如果您不更改任何设置,即使一切都是真的,您的帖子也会失败。如果您超出任何 php.ini 设置的限制/最大值,PHP 将使脚本条件为假。您不必一一更改任何 mysql 设置。如果您插入或更新超过 1000 个查询的任何内容,则需要一些时间。

    【讨论】:

    • 我没看到你的问题在哪里?
    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2013-12-24
    • 2018-11-11
    • 2014-05-31
    相关资源
    最近更新 更多