将mysql表传输到数组

时间:2015-12-14 19:51:33

标签: php mysql arrays

我必须获取一个包含两百万条记录的表,其中包含两列 - idname,每个名称都进行一次爆炸操作,然后每个展开的元素一起保存到文件中它的ID。 id-keyword对必须是唯一的。

这是最快,最节省内存的方法吗?

我一直在考虑这样的事情:

$query = $pdo -> prepare('SELECT id, name FROM table');
$query -> execute();

$time = microtime(true);

if (file_exists('test.txt')) {
        unlink('test.txt');
}
$fh = fopen('test.txt', 'a');
while ($result = $query -> fetch()) {
      $tokens = explode(" ", $result['name']);
      foreach ($tokens as $token) {
           fwrite($fh, $result['id'] . ' ' . $token . PHP_EOL);
      }
}
fclose($fh);

echo microtime(true) - $time;
  1. 但要实现这一目标需要15秒以上,这样做很长,并且数组不是唯一的。
  2. 我还可以创建一个数组作为键的数组,包含id数组作为键,这将解决uniqness问题,但整个结构肯定太大,无法适应内存,并且在合理的时间内。
  3. 我可以创建最多几个记录的数组并不时执行fwrite,但是再次,这些行不会是唯一的。
  4. 我不想在数据库层上执行此操作 - 数据库逻辑越少越好,我也不想执行更繁重的数据库操作。

    我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

我能够通过将结果以块的形式附加到字符串来加速到1,5s,并且偶尔将其写入文件,清除该字符串。

    $query = $pdo -> prepare('SELECT id, name FROM table');
    $query -> execute();
    $fh = fopen('test.txt', 'a');
    $str = '';
    while ($result = $query -> fetch()) {
            $tokens = array_unique(explode(" ", $result['name']));
            foreach ($tokens as $token) {
                    $str .= $result['id'] . " " . $token . "\n";
            }
            if (strlen($str) > 5000) {
                    fwrite($fh, $str);
                    $str = '';
            }
    }
    fclose($fh);

太频繁的fwrite或太长的字符串会使执行时间变长,我想这取决于我的记忆速度。