InnoDB는 600MB 파일 Import에 1시간 이상 소요되며 MyISAM은 몇 분 안에 Import할 수 있습니다.
저는 현재 앱 성능을 테스트하는 환경을 만들고 있으며, MySQL과 InnoDB를 사용하여 어떤 것이 가장 적합한지 테스트하고 있습니다.이 환경에서는 데이터베이스(기존 덤프 로드)를 자동으로 준비하고 테스트 도구를 설치합니다.
MySQL과 InnoDB에서 동일한 데이터 덤프를 테스트하려고 합니다만, 이미 InnoDB 파트의 초기 Import를 사용 가능한 속도로 진행하지 못하고 있습니다.첫 번째 덤프 작업은 더 오래 걸렸지만, 아직 신경 쓰이지 않았다.
$ for i in testdb_myisam testdb_innodb; do time mysqldump --extended-insert $i > $i.sql; done
real 0m38.152s
user 0m8.381s
sys 0m2.612s
real 1m16.665s
user 0m6.600s
sys 0m2.552s
그러나 Import 시간은 상당히 달랐습니다.
$ for i in testdb_myisam testdb_innodb; do time mysql $i < $i.sql; done
real 2m52.821s
user 0m10.505s
sys 0m1.252s
real 87m36.586s
user 0m10.637s
sys 0m1.208s
조사 후 MyISAM에서 InnoDB로 테이블을 바꾸면 시스템이 느려지고 사용되었습니다.set global innodb_flush_log_at_trx_commit=2
:
$ time mysql testdb_innodb < testdb_innodb.sql
real 64m8.348s
user 0m10.533s
sys 0m1.152s
IMHO는 아직도 충격적일 정도로 느리다.또, 디세이블도 하고 있습니다.log_bin
모든 mysql 변수 목록입니다.
이 긴 InnoDB 시간을 받아들여야 하나요? 아니면 개선할 수 있나요?이 MySQL 서버는 순전히 이 테스트 환경만을 위한 것이므로 제가 완전히 제어할 수 있습니다.
초기 Import 시에만 특수 구성을 적용하고 애플리케이션 테스트 시 다시 변경하여 운영 환경에 더 적합하도록 할 수 있습니다.
업데이트:
피드백에 따라 자동 커밋과 다양한 체크를 비활성화했습니다.
$ time ( echo "SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;" \
; cat testdb_innodb.sql ; echo "COMMIT;" ) | mysql testdb_innodb;date
real 47m59.019s
user 0m10.665s
sys 0m2.896s
속도는 좋아졌지만, 그렇게 많지는 않았다.제 테스트에 문제가 있나요?
업데이트 2:
8분 정도밖에 걸리지 않아 다른 기계에 접속할 수 있었습니다.구성을 비교하여 MySQL 설치에 다음 설정을 적용했습니다.
innodb_additional_mem_pool_size = 20971520
innodb_buffer_pool_size = 536870912
innodb_file_per_table
innodb_log_buffer_size = 8388608
join_buffer_size = 67104768
max_allowed_packet = 5241856
max_binlog_size = 1073741824
max_heap_table_size = 41943040
query_cache_limit = 10485760
query_cache_size = 157286400
read_buffer_size = 20967424
sort_buffer_size = 67108856
table_cache = 256
thread_cache_size = 128
thread_stack = 327680
tmp_table_size = 41943040
이 설정을 사용하면, 약 25분으로 단축됩니다.MyISAM은 아직 몇 분 걸리지 않았지만 점점 더 사용할 수 있게 되었습니다.
InnoDB Performance Tuning Tips(특히 첫 번째 정보)에서 Bulk Data Loading Tips(일괄 데이터 로드 팁)를 사용해 보셨습니까?
데이터를 가져올 때
InnoDB
삽입할 때마다 디스크에 로그 플러시가 필요하기 때문에 MySQL이 자동 커밋모드를 유효하게 하고 있지 않은 것을 확인합니다.Import 조작 중에 자동 커밋을 디세블로 하려면 , 다음의 순서로 둘러싸 주세요.SET autocommit
그리고.COMMIT
스테이트먼트:SET autocommit=0; ... SQL import statements ... COMMIT;
mysqldump 옵션을 사용하는 경우
--opt
Import가 빠른 덤프 파일을 입수할 수 있습니다.InnoDB
테이블, 심지어 테이블로 그것들을 싸지 않아도SET autocommit
★★★★★★★★★★★★★★★★★」COMMIT
★★★★★★★★★★★★★★★★★★.「 」가
UNIQUE
세션 체크를 으로 끄면 를 고속화할 수 .secondary 키 、 Import 、 Import 속 const 。SET unique_checks=0; ... SQL import statements ... SET unique_checks=1;
테이블의 I/됩니다.는 I/O가 필요하기 때문입니다.
InnoDB
는 삽입 버퍼를 사용하여 배치에 세컨더리 인덱스레코드를 쓸 수 있습니다.데이터에 중복된 키가 없는지 확인하십시오.「 」가
FOREIGN KEY
테이블 내의 제약조건에서는 Import 세션 중에 외부 키체크를 끄면 테이블 Import 속도를 높일 수 있습니다.SET foreign_key_checks=0; ... SQL import statements ... SET foreign_key_checks=1;
큰 테이블의 경우 디스크 I/O를 크게 절약할 수 있습니다.
IMO, 이 장 전체를 읽을 가치가 있어요.
처음에 거래를 시작하고 마지막에 커밋해 본 적이 있습니까?링크된 질문에서 "Insert Data 스텝을 수정하여 트랜잭션을 시작할 때 시작하고 마지막에 커밋합니다. 분명히 개선될 것이다.
InnoDB는 트랜잭션 방식이지만 MyISAM은 트랜잭션 방식이 아닙니다.트랜잭션 엔진은 트랜잭션을 명시적으로 제어하지 않으면 모든 문을 개별 트랜잭션으로 처리합니다.비용이 많이 들 수 있습니다.
저는 하드 드라이브가 병목 현상이라는 것을 알게 되었습니다. 구식 디스크는 희망이 없고 SSD는 괜찮지만 완벽과는 거리가 멀다는 것입니다.tmpfs로의 Import와 데이터 복사가 훨씬 빨라졌습니다.상세:https://dba.stackexchange.com/a/89367/56667
대량 Import를 많이 할 때 문제가 발생하여 승인된 답변을 추천했습니다.다음과 같은 방법으로 작업 속도를 크게 높일 수 있습니다.
- 기본 키를 제외한 모든 인덱스 삭제, 데이터 로드 및 인덱스 재추가
innodb_log_file_size
*innodb_log_files_in_group
는, 1초 의 빈도로 것을 합니다.
#2에 대해서입니다만, 최신 시스템에서는 디폴트인 5M*2로는 불충분합니다.자세한 것은, 및 을 참조해 주세요.
언급URL : https://stackoverflow.com/questions/2167522/innodb-takes-over-an-hour-to-import-600mb-file-myisam-in-a-few-minutes
'source' 카테고리의 다른 글
Python이 virtualenv 내에서 실행 중인지 확인 (0) | 2022.10.29 |
---|---|
MySQL에서 타임스탬프를 날짜/시간으로 변환하는 방법 (0) | 2022.10.29 |
Python에 "같지 않은" 연산자가 있습니까? (0) | 2022.10.29 |
ASP를 사용한 서버 측 렌더링 Vue.NET Core 2 (0) | 2022.10.29 |
프로그래밍 방식으로 python.exe 위치를 가져오려면 어떻게 해야 합니까? (0) | 2022.10.29 |