programing

PHP/MySQL(InnoDB)로 TRANCATION/COMIT가 성능을 크게 향상시키는 이유는 무엇입니까?

megabox 2023. 10. 21. 10:17
반응형

PHP/MySQL(InnoDB)로 TRANCATION/COMIT가 성능을 크게 향상시키는 이유는 무엇입니까?

대규모 CSV 파일의 데이터를 가져오는 일을 해왔습니다. 대개는 100,000개 미만의 레코드를 사용합니다.저는 PHP와 MySQL(InnoDB tables)로 작업하고 있습니다.MySQL 이전에 PHP를 사용하여 일부 필드를 변환하고 텍스트 처리를 수행해야 했습니다.INSERTs (일부의process_note_data()아래)에 기재되어 있습니다.MySQL의LOAD DATA실현 가능성이 없었으니 제안하지 말아주세요.

나는 최근에 다음을 이용하여 MySQL 트랜잭션을 사용하여 이 프로세스의 속도를 향상시키려고 했습니다.START TRANSACTION그리고.COMMIT. 실적 상승은 놀라웠습니다.처리 시간이 20배 감소했습니다.따라서 20분간의 과정은 1분 정도밖에 걸리지 않았습니다.

문의사항.

1.) 왜 그런 실적이 늘었는지 (20분~1분) 아는 사람?

2.) 10만 건의 기록으로 거래 규모가 얼마나 될지 걱정해야 합니까?

3.) 트랜잭션에서 많은 수의 삽입 및/또는 업데이트에 신경 써야 합니까?

/*
 * Customer Notes Data:
 * Rows are either a meeting, call or note!
 */
$row = 1;
$data = array();
$fields = array();
$line = '';

$db->query('SET autocommit=0;');
$db->query('START TRANSACTION;');

if (($handle = fopen("modules/".$currentModule."/Data/customernote.csv", "r")) !== FALSE) {
  while (($data = fgetcsv($handle, 4096, ',', '"')) !== FALSE && $row < 999000) {
    //Row 1 - CSV header row with field names
    if ($row == 1) {
      $csv_fields = $data;
    } elseif ($row > 1) {
      $fields = $this->process_note_data($data, $csv_fields, $row);
    }
    $row++;
  } // end while
  fclose($handle);
}

$db->query('COMMIT;');
$db->query('SET autocommit=1;');

참고: 텍스트/필드 처리는 에 대한 통화에서 이루어집니다.$this->process_note_data()그 다음에 다른 도우미 클래스를 호출합니다.INSERT스테이트먼트 코드.코드를 모두 포함할 공간이 부족했습니다.$db->query()는 MySQL 쿼리의 일반적인 데이터베이스 개체입니다.

  1. 다음 링크를 확인해 주시기 바랍니다.

    https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-transaction-management.html

    InnoDB는 트랜잭션이 데이터베이스를 수정한 경우 트랜잭션 커밋마다 로그를 디스크에 플러시해야 합니다.기본 자동 커밋 설정과 같이 각 변경 사항에 커밋이 뒤따를 때마다 스토리지 장치의 I/O 처리량이 초당 잠재적인 작업 수에 제한을 둡니다.

  2. 커밋 중에 큰 트랜잭션이 성능에 영향을 미칠 수 있음(위 확인)

  3. 롤백의 경우에만 일부 설정을 사용하여 최적화할 수 있습니다(링크 확인).

나만의 작은 시험.넷(4개 필드 레코드 이전):

INSERT 1 레코드, 거래 없음: 60ms

INSERT 1 레코드, 트랜잭션 사용: 158ms

거래를 이용한 INSERT 200 레코드, 각 레코드 후 커밋:17778ms

무거래를 사용한 INSERT 200 레코드:4940ms

트랜잭션을 사용하여 200개의 레코드를 삽입하고 마지막 레코드 뒤에만 커밋:4552ms

트랜잭션을 사용하는 INSERT 1000 레코드, 마지막 레코드 뒤에만 커밋:21795ms

덴마크의 클라이언트, 벨기에의 서버(Google cloud f1-micro)

댓글로 올리려고 했는데 서식이 안좋아서 미리 사과드립니다 ;-)

언급URL : https://stackoverflow.com/questions/14675147/why-does-transaction-commit-improve-performance-so-much-with-php-mysql-innodb

반응형