当我尝试从 mysql 表中获取大量数据到 redis 数据库时,我遇到了一些问题。无论如何,一段时间后我收到错误“MySQL 服务器已消失”,我不知道为什么..
编辑:
或者,当我使用中断循环的注释代码时,它只是在未完成时“完成”。
这是我使用的 php 代码(由 php-cli 运行):
<?php
require 'Predis/Autoloader.php';
Predis\Autoloader::register();
mysql_connect('localhost', 'root', 'notcorrect') or die(mysql_error());
mysql_select_db('database_that_i_use') or die(mysql_error());
$redis = new Predis\Client();
//starting on 0 but had to edit this when it crashed :(
for($i = 3410000; $i<999999999999; $i += 50000) {
echo "Query from $i to " . ($i + 50000) . ", please wait...\n";
$query = mysql_unbuffered_query('SELECT * FROM table LIMIT ' . $i . ', 50000')or die(mysql_error());
// This was code I used before, but for some reason it got valid when it wasn't supposed to.
/*if(mysql_num_rows($query) == 0) {
echo "Script finished!\n";
break;
}*/
while($r = mysql_fetch_assoc($query)) {
$a = array('campaign_id' => $r['campaign_id'],
'criteria_id' => $r['criteria_id'],
'date_added' => $r['date_added'],
);
$redis->hmset($r['user_id'], $a);
unset($a);
usleep(10);
}
echo "Query completed for 50000 rows..\n";
sleep(2);
}
unset($redis);
?>
我的问题是如何更好地做到这一点,我真的不知道它为什么会崩溃。我的服务器很旧而且速度很慢,可能无法处理这么大量的数据?在我们切换到实际生产之前,这只是一个测试服务器。
值得注意的是,脚本可能运行了半个小时,并且可能是限制语句在数量变高时使它变得非常慢?那么有没有更简单的方法来做到这一点?我今天需要传输所有数据!:)
提前致谢。
编辑:运行示例:
Query from 3410000 to 3460000, please wait...
Query completed for 50000 rows..
Query from 3460000 to 3510000, please wait...
Query completed for 50000 rows..
Query from 3510000 to 3560000, please wait...
Query completed for 50000 rows..
Query from 3560000 to 3610000, please wait...
MySQL server has gone away
编辑:
该表由约 500 万行数据组成,约为 500 万行。800 MB 大小。但是我以后需要为更大的桌子做类似的事情..