阅读65k行挂起PHP / MySQL

我正在开发处理IP地址的PHP应用程序。 我正在使用包含多达40亿行的mysql表。

我有一个脚本,目前需要从该表中获取65536个地址,并且当我尝试提取这些65K行时,mysql < – > php界面无法通过PHP或甚至通过phpMyAdmin给出响应。 如果在命令行中使用,mysql将在0.2秒内给出65K的线路。

包含IP地址的表有3个索引(1个唯一的,2个主键),这些索引应该可以帮助我们更快地完成工作,但是我不能让mysql把一个关联数组返回给PHP,以便继续我的数据处理。

服务器是一个专用的最近Xeon机器,约32GB的内存(我不知道确切的规格)。

有什么线索可以在这里发生?

提前致谢。

mysqliPDO默认都在缓冲模式下运行。 这意味着您的查询实际上受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);