초기 MySQL 버전에서는 DDL 작업(예: 인덱스 생성 등)을 수행하려면 일반적으로 데이터 테이블 잠금이 필요하며 작업 중에 DML 작업이 차단되어 정상적인 비즈니스에 영향을 미칩니다. MySQL 5.6 및 MariaDB 10.0은 DML의 정상적인 실행에 영향을 주지 않고 DDL 작업을 수행할 수 있는 온라인 DDL을 지원하기 시작합니다. 온라인에서 DDL 작업을 직접 실행하는 것은 기본적으로 사용자에게 보이지 않습니다(일부 작업은 성능에 영향을 미칩니다).
다양한 데이터베이스 버전에 따라 다양한 DDL 문 지원에 일정한 차이가 있습니다. 이 문서에서는 DDL 작업을 수행해야 하는 경우온라인 DDL 지원을 참조할 수 있습니다. 이 기사의 상황부분.
이 기사는 계속 수정되고 업데이트될 예정입니다. 더 흥미로운 콘텐츠를 보려면 GITHUB의 프로그래머 성장 계획 프로젝트를 참조하세요.
ALTER TABLE
문에서 온라인 DDL은ALGORITHM
및LOCK
문을 통해 지원됩니다.ALTER TABLE
语句中,支持通过ALGORITHM
和LOCK
语句来实现 Online DDL:
ALGORITHM
- 控制 DDL 操作如何执行,使用哪个算法LOCK
- 控制在执行 DDL 时允许对表加锁的级别ALTER TABLE tab ADD COLUMN c varchar(50), ALGORITHM=INPLACE, LOCK=NONE;复制代码
[NOT] NULL
ALGORITHM | 说明 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
DEFAULT | 默认算法,自动使用可用的最高效的算法 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
COPY | 最原始的方式,所有的存储引擎都支持,不使用 Online DDL,操作时会创建临时表,执行全表拷贝和重建,过程中会写入 Redo Log 和大量的 Undo Log,需要添加读锁,非常低效 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INPLACE | 尽可能避免表拷贝和重建,更确切的名字应该是ENGINE 算法,由存储引擎决定如何实现,有些操作是可以立即生效的(比如重命名列,改变列的默认值等),但有些操作依然需要全表或者部分表的拷贝和重建(比如添加删除列、添加主键、改变列为 NULL 等) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
NOCOPY | 该算法是INPLACE 算法的子集,用于避免聚簇索引(主键索引)的重建造成全表重建,也就说用该算法会禁止任何引起聚簇索引重建的操作 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INSTANT | 用于避免INPLACE
ALTER TABLE tbl_name [WAIT n|NOWAIT] ...CREATE ... INDEX ON tbl_name (index_col_name, ...) [WAIT n|NOWAIT] ...DROP INDEX ... [WAIT n|NOWAIT]DROP TABLE tbl_name [WAIT n|NOWAIT] ...LOCK TABLE ... [WAIT n|NOWAIT]OPTIMIZE TABLE tbl_name [WAIT n|NOWAIT]RENAME TABLE tbl_name [WAIT n|NOWAIT] ...SELECT ... FOR UPDATE [WAIT n|NOWAIT]SELECT ... LOCK IN SHARE MODE [WAIT n|NOWAIT]TRUNCATE TABLE tbl_name [WAIT n|NOWAIT]复制代码
로그인 후 복사
로그인 후 복사
ALGORITHM 지원 알고리즘
|
INPLACE | 테이블 복사 및 재구성을 최대한 피하세요. 보다 정확한 이름은ENGINE 알고리즘이어야 합니다. 스토리지 엔진은 이를 구현하는 방법을 결정합니다. 일부 작업(예: 열 이름 바꾸기, 열 기본값 변경 등)은 여전히 전체 테이블 또는 테이블 일부를 복사하고 다시 작성해야 합니다. 열 추가 및 삭제, 기본 키 추가, 열을 NULL로 변경 등) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
NOCOPY | 이 알고리즘은INPLACE 알고리즘의 하위 집합으로 사용됩니다. 전체 테이블을 재구성하는 클러스터형 인덱스(기본 키 인덱스)를 방지합니다. 즉, 이 알고리즘을 사용하면 클러스터형 인덱스 재구성이 금지됩니다. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INSTANT | 는 데이터 파일을 수정해야 할 때INPLACE 알고리즘의 비정상적인 비효율성 문제를 피하기 위해 사용됩니다. 관련된 모든 테이블 복사 및 재구축 작업은 금지됩니다
算法使用规则:
. INSTANT 알고리즘 지원:MariaDB 10.3.2+,MySQL 8.0.12+. 알고리즘 사용 규칙:
MySQL 서비스는 크게서버 레이어와 스토리지 엔진 레이어로 구성됩니다. 서버 레이어에는 MySQL의 핵심 기능 대부분과 모든 내장 기능, 스토어드 등의 크로스 스토리지 엔진 기능이 포함되어 있습니다. 프로시저 및 트리거, 보기 등 스토리지 엔진 계층은 데이터 저장 및 읽기를 담당하며 플러그인 아키텍처 모델을 채택합니다. COPY 알고리즘은 서버 계층에서 작동하고 실행 프로세스는 서버 계층에서 이루어지므로 모든 스토리지 엔진은 이 알고리즘의 사용을 지원합니다. 실행 프로세스는 아래와 같습니다
Online DDL 执行过程Online DDL 操作主要分为三个阶段:
由于上面三个阶段中对元数据锁的独占, Online DDL 过程必须等待已经持有元数据锁的并发事务提交或者回滚才能继续执行。
评估 Online DDL 操作的性能Online DDL 操作的性能取决于是否发生了表的重建。在对大表执行 DDL 操作之前,为了避免影响正常业务操作,最好是先评估一下 DDL 语句的性能再选择如何操作。 比如 由于在执行 Online DDL 过程中需要记录并发执行的 DML 操作发生的变更,然后在执行完 DDL 操作之后再应用这些变更,因此使用 Online DDL 操作花费的时间比不使用 Online 模式执行要更长一些。 Online DDL 支持情况
重点关注是否重建表和支持并发 DML:不需要重建表,支持并发 DML 最佳。 보조 인덱스
说明: 主键
说明: 普通列
지침: 기본 키작업INSTANTINPLACE테이블 재구성동시 DML메타데이터만 수정추가 기본 키 ❌✅ ②✅ ②✅❌기본 키 삭제❌❌✅❌ ❌기본 키를 삭제하고 새 항목 추가 ❌✅✅✅❌참고: 일반 열 작업 INSTANTINPLACE 테이블 재구성동시 DML메타데이터만 수정 열 추가 ✅ ③✅❌ ③✅ ③❌ 칼럼 삭제됨 ❌ ④ ✅✅ ✅❌열 이름 변경 ❌✅❌✅ ⑤✅순서 변경 열❌ ⑫✅ ✅✅❌ 기본값 설정✅ ✅❌✅✅데이터 유형 수정❌ ❌✅❌ ❌ 확장된
|
操作 | INSTANT | INPLACE | 重建表 | 并发 DML | 只修改元数据 |
---|---|---|---|---|---|
添加STORED 列 |
❌ | ❌ | ✅ | ❌ | ❌ |
修改STORED 列的排序 |
❌ | ❌ | ✅ | ❌ | ❌ |
删除STORED 列 |
❌ | ✅ | ✅ | ✅ | ❌ |
添加VIRTUAL 列 |
✅ | ✅ | ❌ | ✅ | ✅ |
修改VIRTUAL 列的排序 |
✅ | ❌ | ✅ | ❌ | ❌ |
删除VIRTUAL |
③ INSTANT 알고리즘: 컬럼 추가 시알고리즘을 사용하면 다음과 같은 제한 사항이 있습니다. | 컬럼 추가 작업은 지원하지 않는 다른 작업과 결합할 수 없습니다.INSTANT 알고리즘을 하나의ALTER TABLE 문으로 통합 |
새 열은 테이블 끝에만 추가할 수 있으며 MariaDB 10.4 이후에는 다른 열 앞에 배치할 수 없습니다. 임의의 위치에 추가할 수 있습니다. | ROW_FORMAT =COMPRESSED 에 열을 추가할 수 없습니다. |
ALGORITHM=COPY만 지원합니다.데이터 사전 테이블스페이스에 있는 테이블에는 열을 추가할 수 없습니다. 열을 추가할 때 행 크기 제한이 계산되지 않습니다. 이 제한은 DML 작업을 수행할 때 제거됩니다. 테이블을 삽입하거나 업데이트하려면 4 열을 삭제할 때 많은 양의 데이터를 재구성해야 하므로 비용이 많이 듭니다. MariaDB 10.4 이후에는 열 삭제가 INSTANT 알고리즘을 지원합니다 ⑤ 컬럼 이름 변경 시 동시 DML 작업을 지원하기 위해 데이터 타입은 변경하지 않고 컬럼 이름만 변경해야 한다. ⑥ VARCHAR의 길이를 확장할 때 INPLACE는 조건부이며 길이 바이트는 사용되는 길이이다. 문자열의 길이를 식별하고 변경되지 않도록 보장해야 합니다(여기에 언급된 모든 단어는 섹션이며 VARCHAR의 문자 길이가 아닙니다. 바이트 점유는 사용된 문자 세트와 관련됩니다. utf8
문자 세트에서 , 한 문자가 3바이트를 차지하며,
utf8mb4
에서는 4자를 차지합니다. 섹션)
VARCHAR 컬럼 길이가 0~255바이트일 때 길이 식별자는 1바이트를 차지합니다
VARCHAR 컬럼의 경우 길이가 255바이트보다 크면 길이 식별자는 2바이트를 차지합니다
따라서 INPLACE는 0에서 255바이트 사이 또는 256바이트 이상 사이의 변경만 지원합니다. INPLACE에서는 VARCHAR 열 길이 감소가 지원되지 않습니다.
7 자동 증가 컬럼 값의 변경은 데이터 파일이 아닌 메모리에 있는 수정된 값입니다
8 ⑨ 해당 컬럼이로 설정된 경우, 많은 양의 데이터가 재구성됨. 요소 및 삽입된 멤버의 위치
⑫ MariaDB 10.4 이후 열 정렬은 INSTANT 알고리즘을 지원합니다
⑬ MariaDB 10.4.3 이후 InnoDB는 열 길이를 늘리는 INSTANT 알고리즘 사용을 지원하지만 몇 가지 제한 사항이 있습니다. 자세한 내용은 열의 데이터 유형 변경
Operation
INSTANT
INPLACE테이블 다시 작성을 참조하세요. 동시 DML메타데이터만 수정
STORED
열 추가❌❌✅❌❌ 정렬 수정 STORED열❌❌ ✅❌❌
STORED
열 삭제 ❌✅✅ ✅❌
VIRT UAL
열 추가 ✅✅❌✅✅
VIRTUAL
열 정렬 수정✅ ❌✅❌ ❌
VIRTUAL
열 삭제 ✅✅❌✅✅ 외래 키 OperationINSTANT INPLACE테이블 재구성 동시 DML메타데이터만 수정외래 키 제약 조건 추가❌✅ ⑭❌✅✅ 외래 키 제약 조건 삭제 ❌✅ ❌✅✅
참고:
表
操作
INSTANT
INPLACE
重建表
并发 DML
只修改元数据
修改ROW_FORMAT
❌
✅
✅
✅
❌
修改KEY_BLOCK_SIZE
❌
✅
✅
✅
❌
设置持久表统计信息
❌
✅
❌
✅
✅
指定字符集
❌
✅
✅ ⑮
❌
❌
转换字符集
❌
❌
✅ ⑯
❌
❌
优化表
❌
✅ ⑰
✅
✅
❌
使用FORCE
选项重建表
❌
✅ ⑱
✅
✅
❌
执行空的重建
❌
✅ ⑲
✅
✅
❌
重命名表
✅
✅
❌
✅
✅
说明:
表空间
操作
INSTANT
INPLACE
重建表
并发 DML
只修改元数据
重命名常规表空间
❌
✅
❌
✅
✅
启用或者禁用常规表空间加密
❌
✅
❌
✅
❌
启用或者禁用file-per-table
表空间加密
❌
❌
✅
❌
❌
限制
테이블
작업
INSTANT
INPLACE
테이블 재구성
동시 DML
메타데이터만 수정
ROW_FORMAT
❌
✅
✅
✅
❌
수정KEY_BLOCK_SIZE
❌
✅
✅
✅ ❌
영구 테이블 통계 설정
❌
✅
❌
✅
✅
문자 집합 지정
❌
✅ ✅ ⑮
❌
❌
문자 집합 변환
❌ ❌
✅ ⑯
❌
❌
테이블 최적화
❌
✅ ⑰
✅
✅
❌
>FORCE 옵션 재구축 테이블
❌
✅ ⑱
✅
✅
❌
빈 재구축 수행
❌
✅ ⑲
✅ ✅
❌
테이블 이름 바꾸기
✅
✅
❌
✅
✅
ON...CASCADE
또는
ON...SET NULL
제약 조건이 있는 경우
ALERT TABLE LOCK=NONE
구문은 지원되지 않습니다. Onlne DDL 작업이 완료되기 전에 관련 테이블에 대한 메타데이터 잠금을 이미 보유하고 있는 트랜잭션이 커밋되거나 롤백될 때까지 기다려야 합니다. 이 프로세스에서는 관련 테이블의 새 트랜잭션이 차단되어 실행할 수 없습니다.
대형 테이블에서 테이블 재구성과 관련된 DDL을 실행할 때 다음과 같은 제한 사항이 있습니다.
온라인 DDL 작업을 일시 중지하거나 I/A를 제한하는 메커니즘이 없습니다. O 또는 온라인 DDL 작업의 CPU 사용량
작업이 실패할 경우 온라인 DDL 작업을 롤백하는 데 비용이 매우 많이 듭니다.
오래 실행되는 온라인 DDL은 복제 지연을 일으킬 수 있습니다. 온라인 DDL 작업은 슬레이브에서 실행되기 전에 마스터에서 실행되어야 합니다. 이 과정에서 동시에 처리되는 DML은 DDL 작업이 실행되기 전에 슬레이브에서 완료될 때까지 기다려야 합니다.마지막에 작성이 글은 계속 수정되고 업데이트될 예정이니 팔로우하시면 더욱 흥미로운 내용을 보실 수 있습니다.
더 많은 관련 무료 학습 권장사항: mysql 튜토리얼(동영상)
위 내용은 참조 가이드: MySQL 및 MariaDB 온라인 DDL의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!
관련 라벨:
원천:juejin.im
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
최신 이슈
트리거 및 제약 조건을 사용하여 MySQL의 레코드 수 제한
사용자 ID와 가장 친한 친구의 사용자 ID를 저장하는 BFFs라는 테이블이 있는데 각 사용자에 대해 가장 친한 친구 3명으로 테이블을 제한하고 싶습니다. 테이블...
에서 2023-11-14 13:35:02
0
4
434
동일한 열 값을 가진 MySql 행 검색
다음 표를 살펴보겠습니다. IDScore19521003884100573 저는 완전한 SQL 초보이지만 ID2와 4가 포함된 점수를 어떻게 반환합니까? 따라서 ID...
에서 2023-11-10 21:53:39
0
2
331
관련 주제
더>
인기 튜토리얼
더>
최신 다운로드
더>