ALGORITHM = INPLACE보다 ALGORITHM = COPY를 선호하는 이유는 무엇입니까?


16

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

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


COPY를 사용하면 테이블의 인덱스는 어떻게됩니까? 새로운 테이블이 생성되어 처음부터 채워져 조각 모음 된 인덱스로 끝납니 까?
Dave Poole

COPY가 처음부터 채워지면 느린 옵션이지만 인덱스 조각 모음으로 인해 결과 테이블의 성능이 향상 될 수 있습니다.
Dave Poole

@DavePoole 니스 이론,하지만 난 이후 마크 오프 용의자 OPTIMIZE TABLE(나는 그것의 큰 부분으로 인덱스를 조각 모음 것으로 판단 목적으로 사용)를 ALGORITHM=INPLACEMySQL의 5.7.4를 사용합니다. 내가 생각하는 그래서, 예, 사건 COPY 않습니다 조각 모음 인덱스를하지만, 그렇게INPLACE 의 잠재적 인 장점으로 무효, (어떻게 든) COPY.
Mark Amery

2
"MySQL은 5.6 이전에 생성 된 InnoDB 테이블은 지원하지 않습니다 ALTER TABLE ... ALGORITHM=INPLACE시간 컬럼 (DATE, DATETIME 또는 TIMESTAMP)를 포함 테이블 및 사용 재건을하지 않은 ALTER TABLE ... ALGORITHM=COPY..." 온라인 DDL의 제한
JSapkota

답변:


10

예,를 지정할 수있는 경우가 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작업 중 테이블이 잠기고 테이블이 읽기 전용이거나 완전히 잠겨 있고 인덱스를 다시 작성하는 동안 정적 테이블을 읽는 프로세스가 있습니다.


1
ALGORITHM=INPLACE실제로 사람들은 실제로 사용하고 싶을 때 "이것은 온라인 DDL이며 데이터베이스를 잠그지 않습니다"와 혼동하는 경향이 있다고 생각 합니다 LOCK=NONE.
Brendan Byrd

2

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

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

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


1
왜 "이전 호환성"이 아니라 "탈출 해치"라고 부릅니까? 큰 차이는 없지만;)
Stoleg

1
두 버전에서 동일한 코드를 실행해야한다면 "이전 버전과의 호환성"이라고 말할 수 있습니다. 그러나 새 구문이 이전 버전에서 인식되는지에 대해 걱정할 것입니다.
Rick James

-1

InnoDB 테이블 스페이스 암호화를 지원하는 MySQL 버전에서 암호화를 추가하기 위해 테이블을 변경하면 복사 알고리즘을 사용하여 변경이 필요하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.