我正在开发处理IP地址的PHP应用程序。 我正在使用包含多达40亿行的mysql表。
我有一个脚本,目前需要从该表中获取65536个地址,并且当我尝试提取这些65K行时,mysql < – > php界面无法通过PHP或甚至通过phpMyAdmin给出响应。 如果在命令行中使用,mysql将在0.2秒内给出65K的线路。
包含IP地址的表有3个索引(1个唯一的,2个主键),这些索引应该可以帮助我们更快地完成工作,但是我不能让mysql把一个关联数组返回给PHP,以便继续我的数据处理。
服务器是一个专用的最近Xeon机器,约32GB的内存(我不知道确切的规格)。
有什么线索可以在这里发生?
提前致谢。
mysqli和PDO默认都在缓冲模式下运行。 这意味着您的查询实际上受PHP进程内存限制。
从http://php.net/manual/en/mysqlinfo.concepts.buffering.php :
[在缓冲模式],查询结果立即从MySQL服务器传输到PHP,然后保存在PHP进程的内存中。 这允许额外的操作,如计数行数,移动(查找)当前结果指针。 它还允许在处理结果集时在同一连接上发出进一步的查询。 缓冲模式的缺点是较大的结果集可能需要相当多的内存。
您应该通过增加memory_limit设置来增加php.ini中PHP进程的内存限制,或者可以让查询使用非缓冲模式 :
未缓冲的MySQL查询执行查询,然后返回资源,同时数据仍在MySQL服务器上等待被提取。 这在PHP端使用更less的内存,但可以增加服务器上的负载。
Mysqli例子:
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); $uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);
PDO例子:
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);