태그 보관물: alter-table

alter-table

ALGORITHM = INPLACE보다 ALGORITHM = COPY를 선호하는 이유는 무엇입니까? INPLACE가능한 모든 곳에서 사용

MySQL 5.6에 온라인 DDL이 도입되었으므로 ALTER TABLE명령은 선택적으로 지정 ALGORITHM=INPLACE하거나 ALGORITHM=COPY지정할 수 있습니다. 온라인 DDL개요는 기본적으로 INPLACE가능한 모든 곳에서 사용 되며 알고리즘이 더 저렴하다는 것을 암시 합니다.INPLACECOPY

그래서 성명서 ALGORITHM=COPY에 어떤 이유를 명시해야 ALTER TABLE합니까?



답변

예,를 지정할 수있는 경우가 COPY있지만 성능 이외의 다른 이유 일 수 있습니다.

MySQL이 새로운 기능인 버전 5.6의 온라인 DLL 처리를 도입했음을 이해하는 것이 중요합니다. 오프라인 처리를 제거하지 않았습니다. 따라서이 두 가지 모드를 구별 할 필요가 있습니다.

  1. 일부 작업은 여전히 ​​오프라인 모드에서만 작동합니다. 제자리에서 수행 할 수 있거나 수행 할 수없는 DDL 작업 목록은 표 15.10,“ DDL 작업의 온라인 상태 요약 ”을 참조하십시오 .

  2. 온라인 및 오프라인 모드에서의 작업은 동작이 약간 다르므로 호환성 이유로 “오래된”것을 선택할 수 있습니다.

몇 가지 예 (더 제안) :

  1. MySQL은 5.6 이전에 생성 된 InnoDB 테이블은 지원하지 않습니다 ALTER TABLE ... ALGORITHM=INPLACE시간적 열 (포함 테이블 DATE, DATETIME또는 TIMESTAMP) 및 사용 재건되지 않았다 ALTER TABLE ... ALGORITHM=COPY. 이 경우 ALTER TABLE ... ALGORITHM=INPLACE작업이 오류를 반환합니다.

  2. ADD PRIMARY KEY의 절은 해당 데이터 유형의 기본값 (INT의 경우 0, varchar의 경우 빈 문자열)으로 COPY mode자동 변환 NULL되지만 IN_PLACE그렇지 않습니다.

ALGORITHM = COPY 절을 사용하면 기본 키 열에 NULL 값이 있음에도 불구하고 작업이 성공합니다. 데이터가 자동으로 변경되어 문제가 발생할 수 있습니다.

선호하는 또 다른 이유 COPY:

ALGORITHM = COPY 또는 old_alter_table = 1을 지정하는 조작은 특수 시나리오에서 정확한 역 호환성을 위해 필요한 경우 테이블 복사 동작을 강제 실행합니다.

MySQL 매뉴얼은 실제 시나리오에 대해서는 언급하지 않지만 일부는 상상할 수 있습니다. 예를 들어 개발자는 ALTER INDEX작업 중 테이블이 잠기고 테이블이 읽기 전용이거나 완전히 잠겨 있고 인덱스를 다시 작성하는 동안 정적 테이블을 읽는 프로세스가 있습니다.


답변

@Stoleg은 아마도 가장 좋은 대답을 가지고 있지만 여기 또 다른 대답이 있습니다. =COPY에 심각한 버그가있는 경우 개발자 가 탈출 해치로 떠났다는 교육받은 추측입니다 =INLINE. 이렇게 ALTER하면 새 기능이 손상 되어도 사용자가 계속 사용할 수 있습니다.

나는 수년 동안 이와 같은 것들 (플래그 sql_mode, my.cnf설정 등)을 보았습니다 . 새 릴리스의 목적은 새롭고 더 나은 기능을 제공하는 것입니다.

최적화 플래그는이 범주에 속하지만 이전 작업에 매달릴 더 많은 이유가 있습니다. 옵티마이 저는 항상 “잘못된 작업”을합니다. 단순히 너무 많은 가능성이 있습니다.