2012-03-11 295 views
-2

我正在开发一个处理大型MySQL数据库的PHP应用程序,现在由于数据库查询,我开始在PHP中检查我的内存限制(64mb)。我想知道什么最好的方法是防止(如果不是,停止)PHP和MySQL中的内存耗尽?大型MySQL数据库

+1

这取决于你在脚本中做什么以及为什么你要超过内存限制。不知道,唯一的建议是:更好地保存记忆。 – deceze 2012-03-11 08:16:17

回答

-1

我能够将代码压缩到一个SQL查询,以便它只是使用MySQL来获取数字,而不是PHP + MySQL的的:

SELECT COUNT(*) AS 'total', COUNT(DISTINCT u.UniqueUserId) AS 'unique', ((COUNT(*)/(
SELECT COUNT(*) FROM `Sessions` WHERE ApplicationId = '[appid]' AND StartApp BETWEEN '[start]' AND '[end]')) * 100) AS 'percent', u.LangID 
FROM `Sessions` AS s, `UniqueUsers` AS u 
WHERE s.UniqueUserId = u.UniqueUserId AND s.ApplicationId = '[appid]' AND s.StartApp BETWEEN '[start]' AND '[end]' 
GROUP BY u.LangID 

谢谢!

0

尝试在您的网页中使用分页。 或者如果您在您的php脚本(例如cron作业)中进行计算,请尝试按块加载数据块并进行必要的计算。 如果您的表格行太大,您可能会想到将表格字段划分为具有相同唯一ID的新表格(例如userid)。

1

从mysql服务器获得的所有信息是否真的需要生成网页?尽可能多地将数据处理(过滤,分页,聚合计数)移动到数据库服务器。

3

您可以发布您在数据库上运行的查询的示例,以及您希望如何将其用于您的网页?

这是非常罕见的需要64Mb的数据从MySQL服务器生成一个页面。你做了以下限制接收的数据:

  • 使用LIMIT语句只提取第一线
  • 指定SELECT你真的需要(的SELECT *代替)
  • 列越具体可能在你的WHERE子句中
  • 使用mysql_free_result释放两个不同的SQL请求之间的资源(如果你运行其中的几个)?
+0

而不是试图重写SQL查询,我只是发布一个链接到我遇到的问题的PHP文件:[http://pastebin.com/JxCJnaGW](http://pastebin.com/JxCJnaGW )。第一个查询返回12,201行,第二个查询返回2,179行。如果您需要更多信息,请告诉我。 – ub3rst4r 2012-03-11 19:09:41

0

限制将有所帮助。 而不是运行返回100,000行的单个查询,运行返回25,000行的4个查询,并在执行下一个25,000行之前处理这些行并取消设置。

你会这样做的极限。限额0,24999是第一个25000,那么限价25000,50000应该是下一个手数。

0

而不是试图重写SQL查询,我只是发布一个链接到我遇到的问题的PHP文件:http://pastebin.com/JxCJnaGW。第一个查询返回12,201行,第二个查询返回2,179行。如果您需要更多信息,请告诉我。

如果查询返回12000行,则需要有内存将所有这些行存储在某处。如果你通过循环所有的结果,并将它们塞进一个PHP数组,然后他们都计入64MB的PHP内存限制:

while ($row = mysql_fetch_assoc($result)) { 
    $data[] = $row; 
} 

foreach ($data as $d) { 
    echo $d['foo']; 
    echo $d['bar']; 
} 

$data阵列现在需要容纳所有12000个结果在内存中,这将占用可用64MB的很大一部分,甚至可能超过它。在更大的空间节约的事情做的是从MySQL获得的数据只在需要:

while ($row = mysql_fetch_assoc($result)) { 
    echo $row['foo']; 
    echo $row['bar']; 
} 

在这里,我们只持有一行存储在一个时间并在需要时从MySQL获得下一行。这甚至不应该接近内存限制。

这只是一个小例子。每个变量和每一块数据都必须存储在某个地方。您需要了解这一点并在必要时进行优化。