참조 가이드: MySQL 및 MariaDB 온라인 DDL

coldplay.xixi
풀어 주다: 2020-10-27 17:41:17
앞으로
2172명이 탐색했습니다.

MySQL Tutorial이 칼럼에서는 MySQL 및 MariaDB 온라인 DDL을 소개하고 안내합니다.

참조 가이드: MySQL 및 MariaDB 온라인 DDL

개요

초기 MySQL 버전에서는 DDL 작업(예: 인덱스 생성 등)을 수행하려면 일반적으로 데이터 테이블 잠금이 필요하며 작업 중에 DML 작업이 차단되어 정상적인 비즈니스에 영향을 미칩니다. MySQL 5.6 및 MariaDB 10.0은 DML의 정상적인 실행에 영향을 주지 않고 DDL 작업을 수행할 수 있는 온라인 DDL을 지원하기 시작합니다. 온라인에서 DDL 작업을 직접 실행하는 것은 기본적으로 사용자에게 보이지 않습니다(일부 작업은 성능에 영향을 미칩니다).

다양한 데이터베이스 버전에 따라 다양한 DDL 문 지원에 일정한 차이가 있습니다. 이 문서에서는 DDL 작업을 수행해야 하는 경우온라인 DDL 지원을 참조할 수 있습니다. 이 기사의 상황부분.

이 기사는 계속 수정되고 업데이트될 예정입니다. 더 흥미로운 콘텐츠를 보려면 GITHUB의 프로그래머 성장 계획 프로젝트를 참조하세요.

ALTER TABLE문에서 온라인 DDL은ALGORITHMLOCK문을 통해 지원됩니다.ALTER TABLE语句中,支持通过ALGORITHMLOCK语句来实现 Online DDL:

  • ALGORITHM- 控制 DDL 操作如何执行,使用哪个算法
  • LOCK- 控制在执行 DDL 时允许对表加锁的级别
ALTER TABLE tab ADD COLUMN c varchar(50), ALGORITHM=INPLACE, LOCK=NONE;复制代码
로그인 후 복사

ALGORITHM 支持的算法

[NOT] NULL

열 생성

ALGORITHM 说明
DEFAULT 默认算法,自动使用可用的最高效的算法
COPY 最原始的方式,所有的存储引擎都支持,不使用 Online DDL,操作时会创建临时表,执行全表拷贝和重建,过程中会写入 Redo Log 和大量的 Undo Log,需要添加读锁,非常低效
INPLACE 尽可能避免表拷贝和重建,更确切的名字应该是ENGINE算法,由存储引擎决定如何实现,有些操作是可以立即生效的(比如重命名列,改变列的默认值等),但有些操作依然需要全表或者部分表的拷贝和重建(比如添加删除列、添加主键、改变列为 NULL 等)
NOCOPY 该算法是INPLACE算法的子集,用于避免聚簇索引(主键索引)的重建造成全表重建,也就说用该算法会禁止任何引起聚簇索引重建的操作
INSTANT 用于避免INPLACE
  • ALGORITHM- DDL 작업이 수행되는 방식과 사용되는 알고리즘을 제어합니다.
  • LOCK- DDL을 실행할 때 허용되는 테이블 잠금 수준을 제어합니다.
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 지원 알고리즘

ALGORITHM 설명 th >
DEFAULT 기본 알고리즘, 가장 효율적인 알고리즘을 자동으로 사용
COPY
가장 독창적인 방식, 모든 저장 Online DDL을 사용하지 않는 경우 작업 중에 임시 테이블이 생성되고, 이 과정에서 전체 테이블 복사 및 재구성이 수행됩니다. 잠금을 추가해야 하는데 이는 매우 비효율적입니다.
INPLACE 테이블 복사 및 재구성을 최대한 피하세요. 보다 정확한 이름은ENGINE알고리즘이어야 합니다. 스토리지 엔진은 이를 구현하는 방법을 결정합니다. 일부 작업(예: 열 이름 바꾸기, 열 기본값 변경 등)은 여전히 전체 테이블 또는 테이블 일부를 복사하고 다시 작성해야 합니다. 열 추가 및 삭제, 기본 키 추가, 열을 NULL로 변경 등)
NOCOPY 이 알고리즘은INPLACE알고리즘의 하위 집합으로 사용됩니다. 전체 테이블을 재구성하는 클러스터형 인덱스(기본 키 인덱스)를 방지합니다. 즉, 이 알고리즘을 사용하면 클러스터형 인덱스 재구성이 금지됩니다.
INSTANT 는 데이터 파일을 수정해야 할 때INPLACE알고리즘의 비정상적인 비효율성 문제를 피하기 위해 사용됩니다. 관련된 모든 테이블 복사 및 재구축 작업은 금지됩니다

NOCOPY알고리즘 지원:NOCOPY算法支持:MariaDB 10.3.2+,MySQL 不支持该算法

INSTANT算法支持:MariaDB 10.3.2+,MySQL 8.0.12+。

算法使用规则:

  • 如果用户指定的算法为COPY,则 InnoDB 使用COPY算法。
  • 如果用户指定的是COPY之外的其它算法,则 InnoDB 会按照算法效率,选择最高效的算法,最差的情况下采用用户指定的算法。比如用户指定了ALOGRITHM = NOCOPYMariaDB 10.3.2
  • +,
MySQL은 이 알고리즘을 지원하지 않습니다

.ALGORITHM 优劣

INSTANT알고리즘 지원:

MariaDB 10.3.2+,MySQL 8.0.12+.

알고리즘 사용 규칙: