数据大批量迁移处理
在大批量迁移数据的时候,有多种可行的方式;
1、一次查询,然后insetAll插入。但这种方式也有数量上限。
2、分批查询再插入,但是这种量大后会很慢很慢
还有一种推荐的,利用mysqlimport命令,和前两个相比,速度极快
$str = ''; foreach ($addData as $v) { $str .= $v['name'] . "\t" . $v['image'] . "\t" . $v['difficultyLevel'] . "\t" . $v['categoryId'] . "\t" . $v['source'] . "\t" . $v['introduce'] . "\t" . $v['isHasVideo'] . "\t" . $v['description'] . "\t" . $v['cookTime'] . "\t" . $v['unit'] . "\t" . $v['calories'] . "\t" . $v['thirdId'] . "\t" . $v['thirdNo'] . "\t" . $v['createTime'] . "\t" . $v['updateTime'] . "\t" . $v['status'] . "\t" . $v['nutrition'] . "\n"; } //写入到文件 $re = file_put_contents("/tmp/detail.txt", $str); //执行导入数据命令 //注意密码用单引号,注意账号权限,注意格式 $cmd = '/usr/local/mysql/bin/mysqlimport -h' . config("database.db_test.hostname") . ' -u' . config("database.db_test.username") . ' -p\'' . config("database.db_test.password") . '\' db_test /tmp/detail.txt --columns=\'name,image,difficultyLevel,categoryId,source,introduce,isHasVideo,description,cookTime,unit,calories,thirdId,thirdNo,createTime,updateTime,status,nutrition\' -L'; shell_exec($cmd);
10万条的数据 ,基本10秒内插入成功。还是贼拉快的。
注意 缓存文件读写权限要有。字段要对应。表名和缓存文件名要一致(detail )。数据库密码加引号(部分密码里有特殊符号) 服务器要开启shell_exec权限。