>

와 함께 꽤 큰 파일 (39mlm 행이있는 3.5G)을 가져 오려고합니다

set foreign_key_checks=0; 
set sql_log_bin=0; 
set unique_checks=0;
load data infile '/var/lib/mysql-files/2.csv' ignore 
into table main_data fields terminated by ','  
optionally enclosed by '"' 
lines terminated by '\n' 
ignore 1 rows (col, col2, col3);

이미 24 시간이 지났고 /var/lib/mysql/MyDB 의 데이터베이스 파일  내가 가져온 파일이 4G보다 작기 때문에 왜 11G로 성장했는지 모르겠습니다. mysql 8.0입니다. 내가 구성에 추가 한 유일한 것은

innodb_buffer_pool_size = 22G
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
innodb_autoinc_lock_mode=2

이 데이터를 일괄 삽입하면 더 빠를 것이라고 생각합니다 ...

첫 번째 코멘트의 제안자로서 creat 테이블 구문이 있습니다. 이제 크기와 시간에 너무 많은 색인이 문제가 될 수 있다고 생각합니다.

CREATE TABLE `main_data` (
  `file_name` tinyint(4) NOT NULL,
  `line_number` int(11) NOT NULL,
  `link` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `doc_type` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `meta_keywords` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `meta_description` text COLLATE utf8mb4_unicode_ci,
  `language` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `done` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`file_name`,`line_number`),
  UNIQUE KEY `link_UNIQUE` (`link`),
  KEY `done_idx` (`done`),
  KEY `lang_idx` (`language`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

첫 번째 세 열 (file_name, line_number, link) 만 가져오고 나머지는 null입니다.

  • 답변 # 1

    24 시간은 매우 긴 시간입니다- LOAD DATA 를 실행할 때 가장 중요한 요소  버퍼 풀이며 사용자 (22GB)는 가져온 3.5G 파일을 수용하기에 충분해야합니다. 다른 일이 일어나고 있어야합니다. SHOW CREATE TABLE 와 같은 더 많은 데이터를 공유하십시오  사용 된 테이블 및 SHOW PROCESSLIST 에 대한 출력 -테이블을 차단하는 무언가가 있고 프로세스가 시작되기를 기다리고 있습니다. GLOBAL STATUS 를 확인하여 언제든지 부하 상태를 확인할 수 있습니다   innodb%' as well as the 를 위해 Handler_writes`.

    이 정도를 예상 할 수있는 아이디어를주기 위해 SSD 데스크톱 등급 시스템에 안전하게로드하는 데 3.7GB 파일이 200 초 이상 걸리지 않아야합니다. 서버 등급이 아닌 시스템의 모든 최신 MariaDB 및 MySQL 버전에서 기본 (나쁜) 구성에서도 https://dbahire.com/testing-again-load-data-on-mysql-5-6-5-7-8-0-non-ga-and-mariadb-10-0-10 -1-and-10-2-non-ga/

  • 답변 # 2

    추측 ... 당신은 하나의 고유 한 값을 갖는 2 개의 2 차 인덱스를 만들고 있습니다- NULL .

    DROP   done 의 색인  그리고 language , LOAD 를 그런 다음 re- ADD  색인.

    다른 두 인덱스는 ... 둘 다 고유하므로 각 행이 삽입 될 때 둘 다 확인해야합니다. 그러나 buffer_pool은 전체 데이터 세트 및 인덱스보다 훨씬 크기 때문에이 검사는 RAM (buffer_pool)에서 완전히 수행되어야합니다. 즉, "하루"가 아니라 "분"이 기대해야한다는 데 동의합니다.

    이것은 LOAD 입니까  일회성 작업? 테이블에 추가 하시겠습니까? 기타 (여기에서 발생할 수있는 다음 문제로 낚시하고 있습니다.)

관련 자료

  • 이전 postgresql - CHECK 제약 조건을 추가해도 postgres 테이블에서 ATTACH PARTITION의 성능이 향상되지 않습니다
  • 다음 Oracle XE TNS 리스너가 시작되지 않습니다