참조 가이드: MySQL 및 MariaDB 온라인 DDL
MySQL Tutorial이 칼럼에서는 MySQL 및 MariaDB 온라인 DDL을 소개하고 안내합니다.
개요
초기 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;复制代码
ALGORITHM 支持的算法
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+. 알고리즘 사용 규칙:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
따라서 INPLACE는 0에서 255바이트 사이 또는 256바이트 이상 사이의 변경만 지원합니다. INPLACE에서는 VARCHAR 열 길이 감소가 지원되지 않습니다. | 7 자동 증가 컬럼 값의 변경은 데이터 파일이 아닌 메모리에 있는 수정된 값입니다 | 8 ⑨ 해당 컬럼이 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
⑬ MariaDB 10.4.3 이후 InnoDB는 열 길이를 늘리는 INSTANT 알고리즘 사용을 지원하지만 몇 가지 제한 사항이 있습니다. 자세한 내용은 열의 데이터 유형 변경 | Operation |
STORED
열 추가🎜🎜❌🎜🎜❌🎜🎜✅🎜🎜❌🎜🎜❌🎜🎜🎜 🎜 정렬 수정 STORED 열🎜🎜❌🎜🎜❌ 🎜🎜 ✅🎜🎜❌🎜🎜❌🎜🎜🎜🎜 STORED
열 삭제 🎜🎜❌🎜🎜✅🎜🎜✅🎜 🎜✅🎜🎜❌ 🎜🎜🎜🎜VIRT UAL
열 추가 🎜🎜✅🎜🎜✅🎜🎜❌🎜🎜✅🎜🎜✅🎜🎜🎜🎜VIRTUAL
열 정렬 수정🎜🎜✅ 🎜🎜❌🎜🎜✅🎜🎜❌🎜 🎜❌🎜🎜🎜🎜 VIRTUAL
열 삭제 🎜🎜✅🎜🎜✅🎜🎜❌🎜🎜✅🎜🎜✅ 🎜🎜🎜🎜🎜외래 키🎜🎜 🎜🎜🎜Operation🎜🎜INSTANT🎜 🎜INPLACE🎜🎜테이블 재구성🎜🎜 동시 DML🎜🎜메타데이터만 수정🎜🎜🎜🎜🎜🎜외래 키 제약 조건 추가🎜🎜❌🎜🎜✅ ⑭🎜🎜❌🎜🎜✅🎜🎜✅🎜 🎜🎜🎜외래 키 제약 조건 삭제🎜 🎜❌🎜🎜✅🎜🎜 ❌🎜🎜✅🎜🎜✅🎜🎜🎜🎜참고:
- ⑭ 외래 키를 추가할 때
INPLACE
알고리즘은foreign_key_checks
옵션이 비활성화된 경우에만 지원됩니다foreign_key_checks
选项被禁用的时候才支持INPLACE
算法
表
操作 | INSTANT | INPLACE | 重建表 | 并发 DML | 只修改元数据 |
---|---|---|---|---|---|
修改 ROW_FORMAT
|
❌ | ✅ | ✅ | ✅ | ❌ |
修改 KEY_BLOCK_SIZE
|
❌ | ✅ | ✅ | ✅ | ❌ |
设置持久表统计信息 | ❌ | ✅ | ❌ | ✅ | ✅ |
指定字符集 | ❌ | ✅ | ✅ ⑮ | ❌ | ❌ |
转换字符集 | ❌ | ❌ | ✅ ⑯ | ❌ | ❌ |
优化表 | ❌ | ✅ ⑰ | ✅ | ✅ | ❌ |
使用 FORCE 选项重建表 |
❌ | ✅ ⑱ | ✅ | ✅ | ❌ |
执行空的重建 | ❌ | ✅ ⑲ | ✅ | ✅ | ❌ |
重命名表 | ✅ | ✅ | ❌ | ✅ | ✅ |
说明:
- ⑮⑯ 当字符集不同时,需要重建表
- ⑰⑱⑲ 如果表中包含
FULLTEXT
的字段,则不支持 INPLACE
表空间
操作 | INSTANT | INPLACE | 重建表 | 并发 DML | 只修改元数据 |
---|---|---|---|---|---|
重命名常规表空间 | ❌ | ✅ | ❌ | ✅ | ✅ |
启用或者禁用常规表空间加密 | ❌ | ✅ | ❌ | ✅ | ❌ |
启用或者禁用 file-per-table 表空间加密 |
❌ | ❌ | ✅ | ❌ | ❌ |
限制
- 在临时表
TEMPORARY TABLE
上创建索引时会发生表拷贝 - 如果表上有
ON...CASCADE
或者ON...SET NULL
约束,则ALERT TABLE
不支持字句LOCK=NONE
- 참고:
- ⑮⑯ 문자 집합이 다른 경우 테이블은 다음과 같아야 합니다. 재구축됨
- ⑰⑱⑲ 테이블에
FULLTEXT
필드가 포함된 경우 INPLACE는 지원되지 않습니다 -
테이블 공간
작업 INSTANT INPLACE 테이블 재구축 동시 DML 메타데이터만 수정일반 테이블스페이스 이름 바꾸기 ❌ ✅ ❌✅ ✅ 일반 테이블스페이스 암호화 활성화 또는 비활성화 ❌ ✅ ❌ ✅ ❌ 파일 활성화 또는 비활성화 -테이블당
테이블 공간 암호화❌ ❌ ✅ ❌ ❌ 제한 사항
- 임시 테이블
TEMPORARY TABLE
테이블 복사
에 인덱스를 생성할 때 발생합니다. 테이블에 - ⑰⑱⑲ 테이블에
테이블
작업 | INSTANT | INPLACE | 테이블 재구성 | 동시 DML | 메타데이터만 수정 |
---|---|---|---|---|---|
ROW_FORMAT |
❌ | ✅ | ✅ | ✅ | ❌ |
수정KEY_BLOCK_SIZE
|
❌ | ✅ | ✅ | ✅ | ❌|
영구 테이블 통계 설정 | ❌ | ✅ | ❌ | ✅ | ✅ |
문자 집합 지정 | ❌ | ✅ | ✅ ⑮❌ | ❌ | |
문자 집합 변환 | ❌ | ❌✅ ⑯ | ❌ | ❌ | |
테이블 최적화 | ❌ | ✅ ⑰ | ✅ | ✅ | ❌ |
>FORCE 옵션 재구축 테이블 | ❌ | ✅ ⑱ | ✅ | ✅ | ❌ |
빈 재구축 수행 | ❌ | ✅ ⑲ | ✅ | ✅❌ | |
테이블 이름 바꾸기 | ✅ | ✅ | ❌ | ✅ | ✅ |
ON...CASCADE
또는 ON...SET NULL
제약 조건이 있는 경우 ALERT TABLE <code>LOCK=NONE
구문은 지원되지 않습니다. Onlne DDL 작업이 완료되기 전에 관련 테이블에 대한 메타데이터 잠금을 이미 보유하고 있는 트랜잭션이 커밋되거나 롤백될 때까지 기다려야 합니다. 이 프로세스에서는 관련 테이블의 새 트랜잭션이 차단되어 실행할 수 없습니다.
대형 테이블에서 테이블 재구성과 관련된 DDL을 실행할 때 다음과 같은 제한 사항이 있습니다.
온라인 DDL 작업을 일시 중지하거나 I/A를 제한하는 메커니즘이 없습니다. O 또는 온라인 DDL 작업의 CPU 사용량
작업이 실패할 경우 온라인 DDL 작업을 롤백하는 데 비용이 매우 많이 듭니다.🎜🎜더 많은 관련 무료 학습 권장사항: 🎜🎜🎜mysql 튜토리얼🎜🎜🎜(동영상)🎜🎜🎜오래 실행되는 온라인 DDL은 복제 지연을 일으킬 수 있습니다. 온라인 DDL 작업은 슬레이브에서 실행되기 전에 마스터에서 실행되어야 합니다. 이 과정에서 동시에 처리되는 DML은 DDL 작업이 실행되기 전에 슬레이브에서 완료될 때까지 기다려야 합니다. 마지막에 작성이 글은 계속 수정되고 업데이트될 예정이니 팔로우하시면 더욱 흥미로운 내용을 보실 수 있습니다.
위 내용은 참조 가이드: MySQL 및 MariaDB 온라인 DDL의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템으로, 주로 데이터를 신속하고 안정적으로 저장하고 검색하는 데 사용됩니다. 작업 원칙에는 클라이언트 요청, 쿼리 해상도, 쿼리 실행 및 반환 결과가 포함됩니다. 사용의 예로는 테이블 작성, 데이터 삽입 및 쿼리 및 조인 작업과 같은 고급 기능이 포함됩니다. 일반적인 오류에는 SQL 구문, 데이터 유형 및 권한이 포함되며 최적화 제안에는 인덱스 사용, 최적화 된 쿼리 및 테이블 분할이 포함됩니다.

데이터베이스 및 프로그래밍에서 MySQL의 위치는 매우 중요합니다. 다양한 응용 프로그램 시나리오에서 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) MySQL은 웹, 모바일 및 엔터프라이즈 레벨 시스템을 지원하는 효율적인 데이터 저장, 조직 및 검색 기능을 제공합니다. 2) 클라이언트 서버 아키텍처를 사용하고 여러 스토리지 엔진 및 인덱스 최적화를 지원합니다. 3) 기본 사용에는 테이블 작성 및 데이터 삽입이 포함되며 고급 사용에는 다중 테이블 조인 및 복잡한 쿼리가 포함됩니다. 4) SQL 구문 오류 및 성능 문제와 같은 자주 묻는 질문은 설명 명령 및 느린 쿼리 로그를 통해 디버깅 할 수 있습니다. 5) 성능 최적화 방법에는 인덱스의 합리적인 사용, 최적화 된 쿼리 및 캐시 사용이 포함됩니다. 모범 사례에는 거래 사용 및 준비된 체계가 포함됩니다

Apache는 데이터베이스에 연결하여 다음 단계가 필요합니다. 데이터베이스 드라이버 설치. 연결 풀을 만들려면 Web.xml 파일을 구성하십시오. JDBC 데이터 소스를 작성하고 연결 설정을 지정하십시오. JDBC API를 사용하여 Connections, 명세서 작성, 매개 변수 바인딩, 쿼리 또는 업데이트 실행 및 처리를 포함하여 Java 코드의 데이터베이스에 액세스하십시오.

MySQL은 성능, 신뢰성, 사용 편의성 및 커뮤니티 지원을 위해 선택됩니다. 1.MYSQL은 효율적인 데이터 저장 및 검색 기능을 제공하여 여러 데이터 유형 및 고급 쿼리 작업을 지원합니다. 2. 고객-서버 아키텍처 및 다중 스토리지 엔진을 채택하여 트랜잭션 및 쿼리 최적화를 지원합니다. 3. 사용하기 쉽고 다양한 운영 체제 및 프로그래밍 언어를 지원합니다. 4. 강력한 지역 사회 지원을 받고 풍부한 자원과 솔루션을 제공합니다.

Docker에서 MySQL을 시작하는 프로세스는 다음 단계로 구성됩니다. MySQL 이미지를 가져와 컨테이너를 작성하고 시작하고 루트 사용자 암호를 설정하고 포트 확인 연결을 매핑하고 데이터베이스를 작성하고 사용자는 데이터베이스에 모든 권한을 부여합니다.

웹 응용 프로그램에서 MySQL의 주요 역할은 데이터를 저장하고 관리하는 것입니다. 1. MySQL은 사용자 정보, 제품 카탈로그, 트랜잭션 레코드 및 기타 데이터를 효율적으로 처리합니다. 2. SQL 쿼리를 통해 개발자는 데이터베이스에서 정보를 추출하여 동적 컨텐츠를 생성 할 수 있습니다. 3.mysql은 클라이언트-서버 모델을 기반으로 작동하여 허용 가능한 쿼리 속도를 보장합니다.

Laravel은 웹 응용 프로그램을 쉽게 구축하기위한 PHP 프레임 워크입니다. 설치 : Composer를 사용하여 전 세계적으로 Laravel CLI를 설치하고 프로젝트 디렉토리에서 응용 프로그램을 작성하는 등 다양한 기능을 제공합니다. 라우팅 : Routes/Web.php에서 URL과 핸들러 간의 관계를 정의하십시오. 보기 : 리소스/뷰에서보기를 작성하여 응용 프로그램의 인터페이스를 렌더링합니다. 데이터베이스 통합 : MySQL과 같은 데이터베이스와 상자 외 통합을 제공하고 마이그레이션을 사용하여 테이블을 작성하고 수정합니다. 모델 및 컨트롤러 : 모델은 데이터베이스 엔티티를 나타내고 컨트롤러는 HTTP 요청을 처리합니다.

MySQL을 우아하게 설치하는 열쇠는 공식 MySQL 저장소를 추가하는 것입니다. 특정 단계는 다음과 같습니다. 피싱 공격을 방지하기 위해 MySQL 공식 GPG 키를 다운로드하십시오. MySQL 리포지토리 파일 추가 : rpm -uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm yum repository cache : yum 업데이트 설치 mysql : yum 설치 mysql-server startup startup mysql 서비스 : systemctl start mysqlctl start mysqlctl.
