如何确定函数mysqli_multi_query(或mysqli_query)在PHP中收到的最大$ query参数? 我有一个php程序,它生成一个由UPDATE sql命令组成的大字符串,用';'分隔问题是,如果该字符串超过一定长度,mysqli_query会生成一个错误,例如“MySQL服务器已经消失”。我注意到这个长度似乎大约是1MB,但是我怎样才能探测它以确保我永远不会超过这个长度?
脚本需要在25个左右的字段上运行大约7000个更新。一次执行一个更新证明非常慢,连接多个更新的速度要快得多。
是否有可能更快地运行多个查询?
向你提出任何建议!
答案 0 :(得分:5)
您应该查看MySQL错误日志。
如果您无法访问计算机(托管等),您可以向管理员或帮助台询问该日志。
MySQL支持非常大的查询。我不确定是否有任何限制,但是当您使用网络时 - 您可能会遇到数据包大小的问题。
您可以在MySQL配置中检查--max_allowed_packet
,并尝试设置更大的数据包大小。我不确定默认配置,但它可能是1MB,这可能是一个太小的值,无法一次获得7000个更新。
MySQL可能需要更多RAM来处理这样的查询。
如果你无法重新配置MySQL,你必须以某种方式将大查询拆分为较小的查询。
您还可以阅读此内容以获取更多信息:
devshed - MySQL server has gone away
你问:
是否有可能更快地运行多个查询?
这个问题没有简单的答案。这取决于查询,数据库架构等。
在大多数情况下,配置文件中增加MySQL缓存大小可能会对大量简单更新与计算量不大有关,因为数据库引擎将在RAM内存上运行,而不是在硬盘上运行。当使用大缓存时 - 有时第一个大查询可能会更慢,因为数据尚未加载到RAM中,但是当它最终加载时 - 需要大量读/写操作的查询将更快地运行。
稍后添加: 我假设您的数据处理需要php deserialize()函数,这可能很难在纯SQL中实现,您必须在PHP中执行:)如果您有权访问服务器控制台,您可以创建cron(linux sheduler)作业,即调用PHP晚上来自shell的脚本。
稍后添加 在评论讨论后,我还有一个想法。您可以从phpmyadmin进行完整数据库或一个表备份,下载它,在家用计算机上恢复数据(在Windows上,您可以使用XAMPP,WAMP服务器)。在家用计算机上,您可以运行mysql.exe并在本地处理数据。
答案 1 :(得分:0)
我在INSERT语句中发现了16个字段/值对的限制。超过这个数字我得到了一个" Forbidden"错误。我在工作语句中的总INSERT语句长度为392个字符。
答案 2 :(得分:0)
使用for循环执行任何大量工作,只需使用常规mysqli_query。我得到了超过16000个查询。有些事情也必须在php.ini文件中进行更改。 post mb size需要改变。如果发送大量字符,请尽可能大。如果您发送许多不同的变量,也应该更改var input max。使php内存大小更大。运行查询时运行时确保不会耗尽系统内存。如果你做的一切正确,你可以发送超过20000个查询。将php内存设置为至少256mb。如果您发送大量查询,有时可能需要将超时时间从30和60增加到200或更高。如果您没有更改任何设置,即使一切都是真的,您的帖子也会失败。如果超出任何php.ini设置limit / maxes,PHP将使脚本条件为false。您不必逐个更改任何mysql设置。如果您在1000个查询中插入或更新任何内容,则需要一些时间。