programing

mySql을 최적화하여 테이블 추가 열 시간을 단축

bestcode 2022. 9. 16. 00:05
반응형

mySql을 최적화하여 테이블 추가 열 시간을 단축

약 35개의 열과 2개의 인덱스가 있는 170,002,225개의 행이 있는 테이블이 있습니다.열을 추가하고 싶습니다.alter table 명령어는 10시간 정도 소요되었습니다.그 사이 프로세서는 비지 상태도 아니고, 과도한 IO 대기도 없었습니다.이것은 대용량 메모리를 탑재한 4방향 고성능 박스입니다.

이게 제가 할 수 있는 최선인가요?db 튜닝 시 add 열을 최적화하기 위해 볼 수 있는 것이 있습니까?

과거에도 매우 유사한 상황에 직면하여 다음과 같은 방법으로 업무 성과를 향상시킵니다.

  1. 새 열이 포함된 새 테이블을 만듭니다(현재 테이블의 구조를 사용).
  2. 을 실행하다INSERT INTO new_table (column1,..columnN) SELECT (column1,..columnN) FROM current_table;
  3. 현재 테이블의 이름 변경
  4. 현재 테이블의 이름을 사용하여 새 테이블의 이름을 변경합니다.

ALTER TABLEMySQL에서 실제로 새 스키마를 사용하여 새 테이블을 만든 후 다시 만듭니다.INSERT모든 데이터를 삭제하고 오래된 테이블을 삭제합니다.새 테이블을 만들고 데이터를 로드한 다음 테이블 이름을 바꾸면 시간을 절약할 수 있습니다.

"High Performance MySQL book"(percona guys)에서 다음 내용을 참조하십시오.

MyISAM 테이블을 효율적으로 로드하기 위한 일반적인 방법은 키를 비활성화하고 데이터를 로드하고 키를 신장하는 것입니다.

mysql> ALTER TABLE test.load_data DISABLE KEYS;
-- load data
mysql> ALTER TABLE test.load_data ENABLE KEYS;

MySQL 매뉴얼에는 다음과 같은 주의사항이 있으므로 최신 Percona MySQL 빌드 플러스 사용을 권장합니다.

다른 경우에는 데이터를 엄격하게 복사할 필요가 없더라도 MySQL이 임시 테이블을 만듭니다.MyISAM 테이블의 경우 myisam_sort_buffer_size 시스템 변수를 높은 값으로 설정하면 인덱스 재작성 작업(변경 프로세스의 가장 느린 부분)을 고속화할 수 있습니다.

할수있습니다ALTER TABLE DISABLE KEYS먼저 열을 추가한 다음ALTER TABLE ENABLE KEYS여기선 아무것도 할 수 없을 것 같아요

그나저나 몽고DB는 못 가?열을 추가할 때 아무것도 재구축되지 않습니다.

테이블을 변경하기 전에 인덱스를 제거할 수 있습니다.왜냐하면 작성에 가장 많은 시간이 걸리는 것은 인덱스이기 때문입니다.

다른 답변에 대한 몇 가지 코멘트를 종합하면, 이 솔루션은 나에게 효과가 있었습니다(MySQL 5.6).

  1. create table mytablenew like mytable;
  2. alter table mytablenew add column col4a varchar(12) not null after col4;
  3. alter table mytablenew drop index index1, drop index index2,...drop index indexN;
  4. insert into mytablenew (col1,col2,...colN) select col1,col2,...colN from mytable;
  5. alter table mytablenew add index index1 (col1), add index index2 (col2),...add index indexN (colN);
  6. rename table mytable to mytableold, mytablenew to mytable

75M 행 테이블에서는 삽입 전에 인덱스를 삭제하면 쿼리가 43분이 아닌 24분 만에 완료됩니다.

대답에는 '아/아/아니다'가 있습니다.insert into mytablenew (col1) select (col1) from mytable 그 ", "가 됩니다.ERROR 1241 (21000): Operand should contain 1 column(s)를 선택합니다.

대답에는 '아/아/아니다'가 있습니다.insert into mytablenew select * from mytable; 그 ", "가 됩니다.ERROR 1136 (21S01): Column count doesn't match value count at row 1★★★★★★★★★★★★★★★★★★★★★★★★★★★

언급URL : https://stackoverflow.com/questions/5677932/optimize-mysql-for-faster-alter-table-add-column

반응형