2013-10-21 8 views
0

많은 삽입을 실행하는 mySQL 저장 프로 시저가 있습니다. 성능이 좋지 않았기 때문에 INSERT 용 문자열을 작성하는 대신 모든 루프에 삽입하지 않기로 결정했습니다. 프로 시저가 끝나면 준비된 명령문으로 모든 값에 대해 하나의 큰 INSERT 만 수행합니다.준비된 진술의 최대 길이는 얼마입니까?

문제는 내 문장이 VARCHAR보다 커야한다는 것입니다. 그것은 TEXT 여야합니다.

질문 : 할 수 있습니까? 또는 준비된 명령문은 VARCHAR 여야합니까? 준비된 진술의 최대 길이는 얼마입니까? 대한

+1

VARCHAR = 65535 바이트의 최대 길이; 최대 길이는 TEXT = 65535 바이트입니다. –

+0

배치 업데이트는 어떻게됩니까? 여러 개의 insert 문 (각 준비 문)을 실행하고 10 개의 삽입 이후에 일괄 적으로 적용합니다. –

+0

나는 임시 테이블의 옵션을 선택했다. 나는 거기에 모든 것을 삽입하고 결국에는 하나의 INSERT INTO mytable SELECT * FROM mytemp; 그것은 성능을 극적으로 향상시킵니다. 가장 좋은 옵션 성능은 randiel의 답변 일 것입니다. 왜냐하면 파일에서 데이터를로드하는 것이 mysql에서 가장 최적화 된 배치 삽입 옵션이라는 것을 알기 때문입니다. 또한 @ BillKarwin 귀하의 첫 번째 의견은 기본적으로 내 질문에 대답합니다. –

답변

1

LOAD DATA을 사용하십시오. mySQL에서 많은 삽입 작업을 수행 할 때 최상의 성능을 발휘하는 옵션입니다. 입력 데이터도 수정할 수 있습니다.

0

확인 : http://dev.mysql.com/doc/refman/5.0/en/packet-too-large.html - 단일 쿼리에서이 실제 제한

하지만 문제는 너무 많은 삽입을 수행해야하는 경우, 당신은 하나의 INSERT 문을 준비해야하고, 그것에 루프 바인드 값과, 깊은 보인다 오프에 자동 커밋을 설정해야합니다이 과정을 가속화 한

에 의해 하나를 실행하지만, 당신은 다음 문제가됩니다 http://dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html

InnoDB하지만 실행 취소 레코드를 생성 한 1023 동시 트랜잭션의 제한이를 데이터를 수정하여.

innodb_log_file_size

이 설정 모두, N 번째는 프로그램

UPDATE를 결정하는 것이 좋습니다 그래서 기본적으로 당신이 (대신 각 1 행의) 각각의 N 번째 행을 저지 추가 할 필요가, 트랜잭션 크기를 제한한다 : @BillKarwin의 의견을 확인하십시오. 기본적으로 거래 규모에는 제한이 없다고 말할 수 있습니다.

+0

그 한계가 의미하는 것이 아닙니다. 그것은 트랜잭션 당 문장의 수에 대한 제한이 아닙니다. 이것은 롤백 세그먼트의 공간을 차지하는 트랜잭션 (not 문)의 수에 대한 제한입니다. 어쨌든, MySQL 5.5와 그 이후 버전에서는 128x가 더 높았고, MySQL 5.6에서는 128x1023까지 구성 가능합니다. http://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html –

+0

@BillKarwin 맞아요, 업데이트 중입니다 –

+1

작은'innodb_log_fize_size'는 트랜잭션의 범위를 제한하지 않습니다. 로그가 가득 차면 커밋되지 않은 변경 사항이 테이블 스페이스로 플러시되고 로그 파일의 공간을 덮어 쓸 수 있습니다. 즉, 거대한 트랜잭션을 수행 한 다음 롤백하면 이전 버전의 페이지를 롤백 세그먼트에서 복구 한 다음 플러시 세그먼트에서 플러시해야합니다. 거대한 트랜잭션의 롤백은 꽤 비쌀 수 있으므로 주기적 커밋을 권유하는 것이 옳습니다. –

관련 문제