SQL选择查询内存问题

时间:2012-12-26 13:47:54

标签: php mysql sql

我已经让这台服务器设置了一个包含大型统计表的实时流量日志数据库。现在我需要从它创建一个较小的表,比方说30天。

此服务器还有一个复制数据的从属服务器,位于主服务器后面5秒。 我创建了这个slave以减少用于选择查询的服务器进程,因此它只适用于流量日志的插入/更新。

现在我需要将最后一天复制到较小的表中,但仍然不要使用“真正的”DB, 所以我需要从奴隶中选择并插入真正的小桌子。 (从机只允许读操作)。

我正在使用PHP,我无法使用一个查询在一个查询中使用两个不同的数据库来解决这个问题...如果有可能,请告诉我怎么做?

当使用两个查询时,我需要将最后一天保存为PHP MySQL对象。对于300K-650K的行,它开始成为缓存内存问题。我会使用ID的部分选择(通过在where term中设置id)块,但是我没有自动增量id字段,并且没有行的id(当存储流量数据id会占用大量空间时)

所以我正在尝试这个想法,我想得到第二个意见。

如果我将立即采取最后一天(300K行),它将使PHP内存过载。 我可以使用限制块或新想法:一次选择一列并将此列复制到新的真实表中。但我不知道第二种方法是否可行。 insert是否在列级别或行级别查看第一个开放空间? 主要的想法是减少select的大小..所以是否可以按列构建一个select,然后在mysql中将它们作为列插入?

2 个答案:

答案 0 :(得分:0)

如果这只是PHP中的内存问题,您可以尝试使用PDO并一次获取1个结果行而不是同时获取所有结果行。

来自PHP.net的PDO:

<?php
function getFruit($conn) {
    $sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
    foreach ($conn->query($sql) as $row) {
        print $row['name'] . "\t";
        print $row['color'] . "\t";
        print $row['calories'] . "\n";
    }
}
?>

答案 1 :(得分:0)

这里是php开始变得奇怪的地方..我接受了你的建议并开始使用数据块。我用了一个循环来推进2000行跳跃的限制。但有趣的是,当我开始使用php内存使用和内存峰值函数时,我发现块方法在大规模和循环中不起作用的原因是因为为var设置新值不会释放内存在新设置之前的内容..所以你必须使用unset或null以保持你的内存在PHP, -