MySQL1分钟内插入百万数据

$arr =[
    [
        'name' => 'testname1',
        'age' => 18,
    ],
    [
        'name' => 'testname2',
        'age' => 19,
    ],
    [
        'name' => 'testname3',
        'age' => 18,
    ],
];
//将格式化后的数据分片
$splitData = array_chunk($arr, 20000, true);
//mysql执行时间
ini_set('max_execution_time', 0);
//mysql连接
@mysql_pconnect("localhost", "root", "root") or die('connect failed');
@mysql_select_db("test") or die('select db failed');
//这一步很重要 取消mysql的自动提交
mysql_query('SET AUTOCOMMIT=0');
mysql_query('set names utf8');

$begin =  microtime(true);
$sql='';
if (!empty($splitData) && is_array($splitData)) {
    $sql = sprintf("INSERT INTO `user` (`name`,age) VALUES ");

    foreach($splitData as $items) {
        foreach ($items as $key=>$item){
            $itemStr = '( ';
            $itemStr .= sprintf("'%s', %d",$item['name'], (int)$item['age']);
            $itemStr .= '),';
            $sql .= $itemStr;
        }
    }

    // 去除最后一个逗号,并且加上结束分号
    $sql = rtrim($sql, ',');
    $sql .= ';';

    mysql_query($sql);

    //插入1W提交一次
    if ($key % 10000 == 0) {
        mysql_query("commit");
    }

}

$end = microtime(true);

echo "用时 " . round($end - $begin, 3) . " 秒 <hr/>";

原理:mysql插入数据库,插入时候并没有提交到mysql表里,在insert后面需要执行commit操作才会插入数据库。默认mysql是自动提交,如果关闭自动提交,在insert几十万数据在进行commit那么会大大缩短入库时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值