삽입 명령어를 사용하여 큰 데이터 세트를 MySQL 테이블로 전달하고 있는데, 1마일 길이의 문자열 끝에 각 값을 추가한 후 실행하는 것 외에 쿼리를 통해 한 번에 약 1000개의 행을 삽입할 수 있는지 궁금합니다.저는 CodeIgniter 프레임워크를 사용하고 있기 때문에 그 기능도 사용할 수 있습니다.
질문에 대한 답변
1개의 조립INSERT
여러 행이 있는 문이 MySQL에서 하나보다 훨씬 빠릅니다.INSERT
각 행의 스테이트먼트를 지정합니다.
즉, PHP에서 문자열 처리 문제가 발생하고 있는 것처럼 들립니다.이것은 언어의 문제가 아니라 알고리즘의 문제입니다.기본적으로 큰 문자열로 작업할 때는 불필요한 복사를 최소화해야 합니다.이는 주로 연결을 피해야 함을 의미합니다.수백 개의 행을 한 번에 삽입하는 등 대용량 스트링을 구축하는 가장 빠르고 효율적인 메모리 방법은implode()
기능 및 어레이 할당.
$sql = array();
foreach( $data as $row ) {
$sql[] = '("'.mysql_real_escape_string($row['text']).'", '.$row['category_id'].')'; } mysql_query('INSERT INTO table (text, category) VALUES '.implode(',', $sql));
이 접근법의 장점은 지금까지 조립한 SQL 문을 각 연결로 복사하고 다시 복사하지 않는다는 것입니다. 대신 PHP는 이 작업을 한 번 수행합니다.implode()
진술.이것은 큰 승리이다.
조립할 컬럼이 많고 하나 이상의 컬럼이 매우 긴 경우 내부 루프를 구축하여 동일한 작업을 수행하고 사용할 수 있습니다.implode()
values 구를 외부 배열에 할당합니다.
이제 CodeIgniter에서 다중 삽입/배치 삽입이 지원됩니다.
$data = array(
array(
'title' => 'My title' ,
'name' => 'My Name' ,
'date' => 'My date'
),
array(
'title' => 'Another title' ,
'name' => 'Another Name' ,
'date' => 'Another date'
) );
$this->db->insert_batch('mytable', $data);
// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')
mysqli_stmt 클래스를 사용하여 한 행을 삽입하기 위한 쿼리를 준비한 다음 데이터 배열에 대해 반복할 수 있습니다.예를 들어 다음과 같습니다.
$stmt =
$db->stmt_init(); $stmt->prepare("INSERT INTO mytbl (fld1, fld2, fld3, fld4) VALUES(?, ?, ?, ?)"); foreach($myarray as $row) {
$stmt->bind_param('idsb', $row['fld1'], $row['fld2'], $row['fld3'], $row['fld4']);
$stmt->execute(); } $stmt->close();
여기서 ‘idsb’는 바인딩할 데이터의 유형(int, double, string, blob)입니다.
PHP 5의 mysqli는 위의 답변의 삽입 시간을 단축할 수 있는 몇 가지 좋은 기능을 가진 객체입니다.
$mysqli->autocommit(FALSE); $mysqli->multi_query($sqlCombined); $mysqli->autocommit(TRUE);
행을 여러 개 삽입할 때 자동 커밋을 해제하면 삽입 속도가 크게 향상되므로 해제한 후 위와 같이 실행하거나 세미콜론과 멀티쿼리로 구분된 다수의 삽입문인 문자열(sqlCombined)을 작성하기만 하면 문제가 없습니다.
언제든지 mysql을 사용할 수 있습니다.LOAD DATA
:
LOAD DATA LOCAL INFILE '/full/path/to/file/foo.csv' INTO TABLE `footable` FIELDS TERMINATED BY ',' LINES TERMINATED BY 'rn'
다발을 사용하지 않고 대량 삽입을 하다INSERT
진술들.