正在将mysql表传输到数组


Transfering mysql table to an array

我必须获取一个表,该表包含数百万条具有两列的记录——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数组作为键,这将解决唯一性问题,但整个结构肯定太大,无法在合理的时间内放入内存
  3. 我可以创建多达几条记录的数组,并不时执行fwrite,但话说回来,这些行不会是唯一的

我不想在数据库层上这样做——数据库逻辑越少越好,我也不想执行更多繁重的数据库操作。

否则我怎么能这样做?

我能够将结果以块的形式追加到字符串中,并偶尔将其写入文件,清除该字符串,从而将其加速到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太频繁,或者字符串太长,会使执行时间更长,我想这取决于我的内存速度。