public function index()
{
//插入的数据量较大,添加以下代码
//ini_set("memory_limit", "-1");//取消内存限制
//ini_set('max_execution_time', '0');//取消时间限制
set_time_limit(0);//取消时间限制
//查询数据
$data = Db::table('数据表')->select();
//分批插入(方法一)
$arr_chunk= array_chunk($data , 500);//将一个数组分割多个数组
foreach ($arr_chunk as $v) {
//此处批量插入数据操作
$res = Db::name('数据表')->insertAll($v);
}
//分批插入(方法二)插入时间较长
$num = 100;//每次导入条数
$limit = ceil(count($data) / $num);
for ($i = 1; $i <= $limit; $i++) {
$offset = ($i - 1) * $num;
$arr_slice = array_slice($data, $offset, $num);
$res = Db::name('数据表')->insertAll($data);
};
}
//批量插入百万千万数据
public function testInsta()
{
set_time_limit(0);
ini_set("memory_limit", -1);
$startTime = time();
// 插入100w条数据,测试用时 109s
// 插入1000w条数据,测试用时 1339s
$num = 100000;
for ($i = 1; $i <= $num; $i++) {
$insertData[] = array(
'name' => 'name_' . $i,
'sex' => mt_rand(0, 1)
);
}
$onceNum = 1000;//每次处理1000条数据
$limit = ceil($num / $onceNum);
try {
for ($i = 1; $i <= $limit; $i++) {
$offset = ($i - 1) * $onceNum;
$data = array_slice($insertData, $offset, $onceNum);
dump($data);
Db::table('test1')->insertAll($data);
}
$endTime = time();
$useTime = $endTime - $startTime;
echo "$num 数据插入用时:$useTime 秒";
} catch (\Exception $e) {
echo "出现异常:" . $e->getMessage();
}
}
public function testUpdate()
{
set_time_limit(0);
ini_set("memory_limit", -1);
$startTime = time();
$userModel = new Tuser();//定义Tuser数据模型
$num = 10000000;
for ($i = 1; $i <= $num; $i++) {
$updateData[] = array(
'id' => $i,
'num' => mt_rand(0, 100000)
);
}
$onceNum = 1000;//每次处理1000条数据
$limit = ceil($num / $onceNum);
try {
for ($i = 1; $i <= $limit; $i++) {
$offset = ($i - 1) * $onceNum;
$data = array_slice($updateData, $offset, $onceNum);
$userModel->saveAll($data);
}
$endTime = time();
$useTime = $endTime - $startTime;
echo "$num 条数据更新用时:$useTime 秒";
} catch (\Exception $e) {
echo "出现异常:" . $e->getMessage();
}
}
网友评论