나는 약 10 백만 행 (또는 7GB)으로 구성된 상당히 큰 InnoDB-Table을 대량으로 가져 오는 데 어려움을 겪고 있습니다 (지금까지 작업 한 가장 큰 테이블입니다).
Inno의 가져 오기 속도를 개선하는 방법에 대한 조사를 수행했으며 현재 설정이 다음과 같이 보입니다.
/etc/mysql/my.cnf/
[...]
innodb_buffer_pool_size = 7446915072 # ~90% of memory
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000
innodb_thread_concurrency=0
innodb_doublewrite = 0
innodb_log_file_size = 1G
log-bin = ""
innodb_autoinc_lock_mode = 2
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_instances=8
import is done via bash script, here is the mysql code:
SET GLOBAL sync_binlog = 1;
SET sql_log_bin = 0;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
SET SESSION tx_isolation='READ-UNCOMMITTED';
LOAD DATA LOCAL INFILE '$filepath' INTO TABLE monster
COMMIT;
데이터는 CSV
파일 로 제공 됩니다.
현재 저는 2 백만, 3 백만,… 각 행으로 더 작은 '테스트 덤프'로 설정을 테스트하고 time import_script.sh
성능을 비교 하는 데 사용합니다.
단점은 전체 실행 시간 만 가져 오기 때문에 전체 가져 오기가 완료 될 때까지 기다려야 결과가 나옵니다.
지금까지 내 결과 :
- 10,000 행 : <1 초
- 100 000 행 : 10 초
- 300,000 행 : 40 초
- 2 백만 행 : 18 분
- 3 백만 줄 : 26 분
- 4 백만 행 : (2 시간 후 취소)
'요리 책'솔루션이 없으며 최적의 설정 조합을 스스로 파악해야합니다.
설정 변경 사항에 대한 제안 이외에도 가져 오기 프로세스를보다 효과적으로 벤치마킹 할 수있는 방법에 대해 더 많은 정보를 얻을 수 있습니다. 진행 상황과 병목 현상이 발생하는 위치에 대해 더 많은 통찰력을 얻을 수 있습니다.
변경중인 설정에 대한 설명서를 읽으려고했지만 다시 부작용을 알지 못하고 잘못 선택한 값으로 성능이 저하 될 수도 있습니다.
현재 채팅 MyISAM
및 가져 오기 및 테이블 엔진 변경 중에 사용할 제안을하고 싶습니다 .
이것을 시도하고 싶지만 잠시 DROP TABLE
동안 쿼리가 완료되는 데 몇 시간이 걸립니다. (내 설정이 최적이 아닌 다른 표시기 인 것 같습니다).
추가 정보 :
현재 사용중인 컴퓨터에는 8GB의 RAM과 5400RPM의 솔리드 스테이트 하이브리드 하드 드라이브가 있습니다.
우리는 또한 문제의 테이블에서 쓸모없는 데이터를 제거하는 것을 목표로하지만 여전히
a) 테스트 automatic data cleanup feature
하는 동안 약간의 빠른 가져 오기가
필요합니다. 최신 데이터, 마지막 가져 오기에 24 시간 이상 소요)
mysql> SHOW CREATE TABLE monster\G
*************************** 1. row ***************************
Table: monster
Create Table: CREATE TABLE `monster` (
`monster_id` int(11) NOT NULL AUTO_INCREMENT,
`ext_monster_id` int(11) NOT NULL DEFAULT '0',
`some_id` int(11) NOT NULL DEFAULT '0',
`email` varchar(250) NOT NULL,
`name` varchar(100) NOT NULL,
`address` varchar(100) NOT NULL,
`postcode` varchar(20) NOT NULL,
`city` varchar(100) NOT NULL,
`country` int(11) NOT NULL DEFAULT '0',
`address_hash` varchar(250) NOT NULL,
`lon` float(10,6) NOT NULL,
`lat` float(10,6) NOT NULL,
`ip_address` varchar(40) NOT NULL,
`cookie` int(11) NOT NULL DEFAULT '0',
`party_id` int(11) NOT NULL,
`status` int(11) NOT NULL DEFAULT '2',
`creation_date` datetime NOT NULL,
`someflag` tinyint(1) NOT NULL DEFAULT '0',
`someflag2` tinyint(4) NOT NULL,
`upload_id` int(11) NOT NULL DEFAULT '0',
`news1` tinyint(4) NOT NULL DEFAULT '0',
`news2` tinyint(4) NOT NULL,
`someother_id` int(11) NOT NULL DEFAULT '0',
`note` varchar(2500) NOT NULL,
`referer` text NOT NULL,
`subscription` int(11) DEFAULT '0',
`hash` varchar(32) DEFAULT NULL,
`thumbs1` int(11) NOT NULL DEFAULT '0',
`thumbs2` int(11) NOT NULL DEFAULT '0',
`thumbs3` int(11) NOT NULL DEFAULT '0',
`neighbours` tinyint(4) NOT NULL DEFAULT '0',
`relevance` int(11) NOT NULL,
PRIMARY KEY (`monster_id`),
KEY `party_id` (`party_id`),
KEY `creation_date` (`creation_date`),
KEY `email` (`email`(4)),
KEY `hash` (`hash`(8)),
KEY `address_hash` (`address_hash`(8)),
KEY `thumbs3` (`thumbs3`),
KEY `ext_monster_id` (`ext_monster_id`),
KEY `status` (`status`),
KEY `note` (`note`(4)),
KEY `postcode` (`postcode`),
KEY `some_id` (`some_id`),
KEY `cookie` (`cookie`),
KEY `party_id_2` (`party_id`,`status`)
) ENGINE=InnoDB AUTO_INCREMENT=13763891 DEFAULT CHARSET=utf8
SHOW CREATE TABLE yourtable\G
이 천만 행 테이블의 테이블 구조를 보여주기 위해 실행 하십시오.
innodb_doublewrite = 0
) 를 비활성화하면 MySQL 설치가 충돌 안전하지 않습니다. MySQL 고장이 아닌 정전이 발생하면 데이터가 자동으로 손상 될 수 있습니다.