Mysql 10万级别数据插入

Posted 小林同学的笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql 10万级别数据插入相关的知识,希望对你有一定的参考价值。

需求

一次性往数据库插入10万条数据(使用场景:数据表数据太大导致查询缓慢时,进行分表操作)

准备工作

连接数据库

 
   
   
 
$servername = "localhost";
$port = 3306;
$username = "root";
$password = "";
$dbname = "test";
// 创建连接
$conn = new \mysqli($servername, $username, $password, $dbname, $port);

// 检测连接
if ($conn->connect_error) {
 die("connect failed: " . $conn->connect_error);
生成10万条数据 

 
   
   
 
   
     
     
   
//用range函数 生成10个数据        
foreach (range(1,100000as $k=>$v){
    $arr[$k]['age']=$v;
    $arr[$k]['name']='testname'.$v;
}

单条插入


 
   
   
 
//开始时间        
$costBegin = microtime(true);
if (!empty($arr)) {
    foreach($arr as $v) {
    $sql = "INSERT INTO user_info (name, age) VALUES (\"{$v['name']}\",{$v['age']})"
    if ($conn->query($sql) === TRUE) {
    } else {
     echo "Error: " . $sql . "<br>" . $conn->error;
    }
  }
}
//结束时间
$costEnd = microtime(true);
$cost = round($costEnd - $costBegin, 3);
echo "用时{$cost}秒";
$conn->close();  

采用单条插入方式,数据插入不到两万条,数据库扛不住压力,报502 响应超时。

拼接sql插入


 
   
   
 
//开始时间
$costBegin = microtime(true);
if (!empty($arr)) {
    $sql = sprintf("INSERT INTO user_info (name, age) VALUES ");
    foreach($arr as $v) {
     $sql .= "(\"{$v['name']}\",{$v['age']}),";
  }

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

    if ($conn->query($sql) === TRUE) {
    } else {
     echo "Error: " . $sql . "<br>" . $conn->error;
    }
}
//结束时间
$costEnd = microtime(true);
$cost = round($costEnd - $costBegin, 3);
echo "用时{$cost}秒";

$conn->close();  

拼接插入方式10万条数据,经过多次测试用时平均0.8秒。


以上是关于Mysql 10万级别数据插入的主要内容,如果未能解决你的问题,请参考以下文章

百万级别数据批量插入 MySQL,哪种方式最快?

百万级别数据批量插入 MySQL,哪种方式最快?

Mysql千万级别数据批量插入,性能提高

PHP 千万级别数据插入

MySQL插入10万数据时间

1亿条数据批量插入 MySQL,哪种方式最快