codememo

MySQL 비활성화 및 활성화 키

tipmemo 2023. 9. 25. 22:46
반응형

MySQL 비활성화 및 활성화 키

MySQL 데이터베이스에는 2,000,000개의 기록이 있는 표가 있습니다.이제 이 표에 6,000,000개의 새로운 레코드를 추가해 보겠습니다.

삽입 속도를 높이기 위해 다음과 같이 비활성화/활성화 키를 사용해야 한다고 생각했습니다.

ALTER TABLE cars DISABLE KEYS;

INSERT INTO cars ...
...
...
INSERT INTO cars ...

ALTER TABLE search_all_values ENABLE KEYS;

OPTIMIZE TABLE cars;

하지만 어떻게든 키를 비활성화/활성화하면 빈 테이블 삽입에 사용하는 것이 더 합리적일 것이라고 생각합니다.

2가 할 때 .ENABLE KEYS, mysql은 모든 인덱스(기존 레코드 및 새로 추가된 레코드 포함)를 다시 생성할 것이며, 이는 제 경우 전체적으로 효율적인 데이터 삽입을 생성하지 못할 가능성이 있습니다.모든 인덱스를 다시 생성하는 데는 오랜 시간이 걸릴 이며 아마도 그렇게 될 것입니다.OPTIMIZE TABLE

제가 맞는 것인지, 그리고 어떻게 하면 제 경우에 효율적으로 데이터를 삽입할 수 있을까요?에 대한 의견을 묻고 싶습니다.

엔진 유형에 따라 접근 방식을 선택해야 합니다.My ISAM 또는 InnoDB에 대한 최적화.

최근 데이터를 삽입하는 여러 방법을 비교하는 벤치마크를 실행하여 삽입 전부터 모든 인덱스가 완전히 복원될 때까지의 시간을 측정했습니다.빈 테이블 위에 있었는데 천만 줄까지 써버렸어요.

의 ISAM을 한 마이 ISAM LOAD DATA INFILE그리고.ALTER TABLE ... ENABLE/DISABLE KEYS(Windows 7 시스템의 MySQL 5.5.27 - 지금은 Linux 시스템에서 시험 중입니다).

Enable 및 DISELE KEYS는 InnoDB에 대해 작동하지 않으며 MyISAM에만 해당됩니다. InnoDB합니다를 SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0; 항목이 것이 하십시오(으)로 설정하는 것을 잊지 1업로드가 완료된 후).

는 필요 것 .OPTIMIZE TABLE대량 삽입 후 - MySQL 행은 삽입에 의해 순서가 정해지며 인덱스는 어쨌든 재구성됩니다.대량 삽입을 함으로써 "추가적인 조각화"가 발생하지 않습니다.

제가 사실과 다른 실수를 했다면 자유롭게 의견을 내주세요.

업데이트: 더 최근에 완성된 테스트 결과에 따르면 비활성화/활성화 키에 대한 조언이 잘못된 것으로 나타났습니다.

과 빈 InnoDB/My가 인 및 등 .ISAM이 미리 채워진 테이블, 선택 및 삽입 속도가 다음과 같은 여러 가지 테스트를 실행하도록 했습니다.LOAD DATA LOCAL,INSERT INTO,REPLACE INTO그리고.UPDATE이 "" "" 에서 ()의합니다.DELETE FROM ... ORDER BY RAND() LIMIT ...고정 시드를 사용하여 비교 가능) 및 활성화 및 비활성화된 인덱스를 제공합니다.

Windows 및 Linux에서 다양한 MySQL 버전(5.0.27, 5.0.96, 5.1.something, 5.5.27, 5.6.2)을 사용하여 테스트했습니다.테이블이 비었을 때만 제 ISAM이 이겼습니다.InnoDB는 데이터가 이미 존재하고 일반적으로 성능이 더 우수할 때 더 빠릅니다(hdd-space를 제외하고 - My ISAM은 디스크에서 더 작습니다).

그러나 이를 실제로 활용하려면 다른 버전, 다른 구성 설정 및 많은 인내심과 함께 특히 이상한 불일치와 관련하여 직접 테스트해야 합니다(5.0.97은 동일한 구성의 5.5.27보다 훨씬 빠름).우리가 발견한 것은DISABLE KEYS그리고.ENABLE KEYS빈 테이블에서 시작하지 않으면 가치도 없고 때로는 해로울 수도 있습니다.

새 키를 인덱싱하는 데 시간이 좀 걸릴 것입니다.이 작업을 한 번에 수행할 것인지(먼저 실행 중지할 것인지), 한 번에 하나씩 수행할 것인지(있는 그대로 유지하고 각 레코드를 추가할 때 색인화할 수 있도록 할 것인지)는 사용자가 결정해야 합니다.

당신의 키를 비활성화하는게 아니라 후자로 하겠습니다.서버에 과도한 스트레스를 주는 것이 두려울 경우 분당 특정 양의 삽입물만 삽입하는 등 일괄 삽입을 시도해 볼 수 있습니다.

언급URL : https://stackoverflow.com/questions/8210608/mysql-disable-enable-keys

반응형