>  기사  >  데이터 베이스  >  mysql에서 일괄적으로 데이터를 입력하는 방법

mysql에서 일괄적으로 데이터를 입력하는 방법

coldplay.xixi
coldplay.xixi원래의
2021-01-04 17:47:3711510검색

MySQL의 일괄 데이터 입력 방법: 1. 루프 삽입을 사용합니다. 2. 연결 리소스를 줄이고 SQL 문을 연결합니다. 3. 저장 프로시저를 사용합니다. 4. [MYSQL LOCAL_INFILE]을 사용합니다.

mysql에서 일괄적으로 데이터를 입력하는 방법

이 튜토리얼의 운영 환경: Windows 7 시스템, mysql 버전 8.0.22, DELL G3 컴퓨터 이 방법은 모든 브랜드의 컴퓨터에 적합합니다.

관련 무료 학습 권장사항: mysql 비디오 튜토리얼

Mysql 일괄 데이터 입력 방법:

방법 1: 루프 삽입

이것은 또한 데이터의 양이 그다지 크지 않은 경우에 가장 일반적인 방법입니다. , 사용할 수 있지만 데이터베이스에 연결하는 데 필요한 리소스가 매번 소모됩니다.

일반적인 아이디어는 다음과 같습니다

(여기에 의사 코드를 작성합니다. 구체적인 작성은 자신의 비즈니스 로직이나 프레임워크 구문과 결합될 수 있습니다)

for($i=1;$i<=100;$i++){
 $sql = &#39;insert...............&#39;;
 //querysql
}
foreach($arr as $key => $value){
$sql = &#39;insert...............&#39;;
 //querysql
}
while($i <= 100){
$sql = &#39;insert...............&#39;;
 //querysql
 $i++
}

너무 일반적이고 동시에 어렵지 않기 때문에 오늘은 주로 쓰는 내용이 아니어서 여기서는 쓰지 않겠습니다. 더 알려주세요

방법 2: 연결 자원을 줄이고 SQL을 스플라이스

의사 코드는 다음과 같습니다

//这里假设arr的key和数据库字段同步,其实大多数框架中在php操作数据库的时候都是这么设计的
$arr_keys  = array_keys($arr);
$sql    = &#39;INSERT INTO tablename (&#39; . implode(&#39;,&#39; ,$arr_keys) . &#39;) values&#39;;
$arr_values  = array_values($arr);
$sql    .= " (&#39;" . implode("&#39;,&#39;" ,$arr_values) . "&#39;),";
$sql    = substr($sql ,0 ,-1);
//拼接之后大概就是 INSERT INTO tablename (&#39;username&#39;,&#39;password&#39;) values
(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;)
.......
//querysql

이렇게 작성합니다. 일반적으로 10,000개의 항목을 삽입하는 데에는 큰 문제가 없습니다. 데이터가 매우 길지 않는 한 일반적인 일괄 삽입(예: 카드 번호 일괄 생성, 무작위 코드 일괄 생성 등)을 처리하는 데 충분합니다. . .

방법 3: 저장 프로시저 사용

우연히 이것을 다시 사용하고 SQL만 지불하면 됩니다. 특정 비즈니스 로직을 직접 결합할 수 있습니다.

delimiter $$$
create procedure zqtest()
begin
declare i int default 0;
set i=0;
start transaction;
while i<80000 do
 //your insert sql 
set i=i+1;
end while;
commit;
end
$$$
delimiter;
call zqtest();

이것은 테스트 코드일 뿐입니다. 특정 매개변수를 직접 정의할 수 있습니다.

한 번에 80,000개의 항목을 삽입하고 있지만, 각 조각의 데이터 양은 매우 많습니다. 및 텍스트 필드

6.524초가 소요됩니다

방법 4: MYSQL LOCAL_INFILE

사용합니다. 현재 이것을 사용하고 있으니 참고용으로 pdo 코드도 복사해둡니다

//设置pdo开启MYSQL_ATTR_LOCAL_INFILE
/*hs96.cn@gmail.com
public function pdo_local_info ()
{
  global $system_dbserver;
  $dbname = &#39;hs96.cn@gmail.com&#39;;
  $ip  = &#39;hs96.cn@gmail.com&#39;;
  $user = &#39;hs96.cn@gmail.com&#39;;
  $pwd  = &#39;hs96.cn@gmail.com&#39;;
  $dsn  = &#39;mysql:dbname=&#39; . $dbname . &#39;;host=&#39; . $ip . &#39;;port=3306&#39;;
  $options = [PDO::MYSQL_ATTR_LOCAL_INFILE => true];
  $db  = new PDO($dsn ,$user ,$pwd ,$options);
  return $db;
 }
//伪代码如下
public function test(){
  $arr_keys   = array_keys($arr);
  $root_dir   = $_SERVER["DOCUMENT_ROOT"] . &#39;/&#39;;
  $my_file   = $root_dir . "hs96.cn@gmail.com/sql_cache/" . $order[&#39;OrderNo&#39;] . &#39;.sql&#39;;
  $fhandler   = fopen($my_file,&#39;a+&#39;);
  if ($fhandler) {
  $sql = implode("\t" ,$arr);
   $i = 1;
   while ($i <= 80000)
   {
    $i++;
    fwrite($fhandler ,$sql . "\r\n");
   }
   $sql = "LOAD DATA local INFILE &#39;" . $myFile . "&#39; INTO TABLE ";
   $sql .= "tablename (" . implode(&#39;,&#39; ,$arr_keys) . ")";
   $pdo = $this->pdo_local_info ();
   $res = $pdo->exec($sql);
   if (!$res) {
    //TODO 插入失败
   }
   @unlink($my_file);
  }
}

이것도 양이 많습니다 각 조각에는 많은 데이터가 있고 varchar4000 및 텍스트 필드가 많습니다

2.160초가 걸립니다

위는 기본 요구 사항을 충족합니다. 1백만 개의 데이터는 큰 문제가 아닙니다. 그렇지 않으면 데이터가 너무 커서 하위 데이터베이스와 테이블이 포함됩니다. , 또는 큐를 사용하여 삽입됩니다.

위 내용은 mysql에서 일괄적으로 데이터를 입력하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.