2011-09-18 4 views

답변

6

불행히도, 당신이 할 수있는 일은별로 없을 것입니다. 새로운 컬럼을 삽입 할 때, MySQL은 테이블의 복사본을 만들고 거기에 새로운 데이터를 삽입합니다. 당신 더 빨리이 내 경험되지 않았습니다

CREATE TABLE new_table LIKE old_table; 
ALTER TABLE new_table ADD COLUMN (column definition); 
INSERT INTO new_table(old columns) SELECT * FROM old_table; 
RENAME table old_table TO tmp, new_table TO old_table; 
DROP TABLE tmp; 

을 찾을 수 있지만, 나는 다른 사람들이 성공을 거두었습니다 들었습니다. 또한 삽입 전에 나중에 new_table에서 색인을 사용하지 않도록 설정하고 나중에 다시 사용하도록 설정할 수 있습니다. 이 경우 전환하는 동안 old_table에 삽입 될 수있는 데이터가 손실되지 않도록주의해야합니다.

변경 중에 사용자에게 영향을주는 경우 pt-online-schema-change을 확인하면 ALTER TABLE 문을 실행하여 수정 된 테이블을 계속 사용할 수 있습니다. (이 그러나 프로세스의 속도를하지 않습니다.)이 더 빠르게 할 수있는 네 가지 주요 가지가 있습니다

+0

시간과 대기 시간은 일을하지 않았다. 마지막으로 테이블의 복사본을 만들고, 새로운 열을 추가하고, 인덱스를 제거하고, jiffy –

+0

+1에 레코드를 복사했습니다. 내가 제안 할 두 가지 작은 변화가 있지만 나를 위해 일했다. RENAME new_table TO tmp, old_table TO new_table; 는 이어야합니다. RENAME 테이블 new_table TO old_table, old_table TO tmp; – pinaki

+0

@pinaki 감사합니다. 그게 분명 내가 의미했던 것입니다. –

0

마이클의 해결책은 다소 속도가 빨라질 수 있지만 데이터베이스를 살펴보고 큰 테이블을 작은 테이블로 분해해야합니다. 이것을보십시오 : link. 데이터베이스 테이블을 표준화하면 장래에 많은 시간을 절약 할 수 있습니다.

+0

우리는 리눅스에서 MYISAM을 사용하고 있습니다. 나는 테이블에 새로운 타입을 삽입하는 것을 의미합니다. –

+0

이것은 질문에 대답하지 않기 때문에 주석으로 게시해야합니다. –

+0

@coder - 내 데이터베이스가 정규화되지 않았다고 생각하는 이유는 무엇입니까? –

1

일반적으로 새 줄 삽입은 많은 색인이 있다는 것을 의미하므로 색인을 다시 고려해 볼 것을 제안합니다.

+0

예, 색인을 제거하고 새 열을 추가 한 다음 다시 색인을 생성 할 수 있습니다. 그건 내가 생각보다 빨리 –

3

:

  1. 하는 경우에 매우 세분화 될 수있는 원래의 테이블을 innodb_file_per_table 사용이 파일 시스템이므로 먼저 조각 모음을 시도 할 수 있습니다.

  2. 버퍼 풀을 합리적인 수준으로 크게 설정하여 더 많은 데이터, 특히 보조 인덱스가 적합합니다.

  3. innodb_io_capacity를 평소보다 높게 설정하면 삽입 버퍼 병합과 수정 된 페이지의 플러시가보다 빠르게 수행됩니다. InnoDB 플러그인이있는 MySQL 5.1 또는 5.5 이상이 필요합니다.

  4. MySQL 5.1 with InnoDB 플러그인과 MySQL 5.5 이상은 빠른 변경 테이블을 지원합니다. 훨씬 더 빠르게 만드는 것 중 하나는 외래 키가 아닌 고유하지 않은 인덱스를 추가하거나 다시 작성하는 것입니다. 따라서 다음을 수행 할 수 있습니다.

A. ALTER TABLE FN에없는 고유하지 않은 색인을 삭제하십시오.

B. ALTER TABLE 비 고유 FK 색인을 다시 추가하십시오.

a :

다음과 같은 이점이 있습니다. 버퍼 풀은 고유하거나 FK에있는 것 중 일부만 보유해야하기 때문에 단계 A에서 버퍼 풀을 덜 사용합니다. 인덱스는이 단계에서 무작위로 업데이트되므로 버퍼 풀에 완전히 들어 가지 않으면 성능이 훨씬 저하됩니다. 재건의 기회가 더 빨리 유지됩니다.

b. 빠른 변경 테이블은 항목을 정렬 한 다음 색인을 작성하여 색인을 다시 작성합니다.이것은 더 빠르며 더 높은 페이지 채우기 비율로 색인을 생성하기 때문에 시작하기가 더 빨라지고 빠릅니다.

가장 큰 단점은 두 단계로 진행되고 첫 번째 단점 이후에 좋은 성능을 위해 필요한 색인이없는 것입니다. 이것이 문제인 경우 새로운 테이블 접근법에 복사본을 시도해 볼 수 있습니다. 처음에는 새 테이블에 대해 고유 한 FK 인덱스를 사용하고 나중에는 고유하지 않은 테이블을 추가합니다.

MySQL 5.6에만 해당하지만 기능 요청이 http://bugs.mysql.com/bug.php?id=59214이면 삽입 버퍼 변경 내용이 디스크로 플러시되는 속도가 빨라지고 버퍼 풀에서 차지할 수있는 공간의 양이 제한됩니다. 이는 큰 작업에 대한 성능 제한 일 수 있습니다. 인서트 버퍼는 2 차 색인 페이지의 변경 사항을 캐시하는 데 사용됩니다.

우리는이 때로는 여전히 실망스럽게도 느린 것을 알고 진정한 온라인 테이블을 변경한다는 것은 매우 매우 바람직하다

이 내 개인적인 의견입니다. 오라클의 공식적인 견해에 대해서는 오라클 홍보 담당자에게 문의하십시오.

MySQL 수석 수석 기술 지원 엔지니어 James Day

관련 문제