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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

mysqlviewshavelimitations : 1) 그들은 upportallsqloperations, datamanipulation throughviewswithjoinsorbqueries를 제한하지 않습니다

적절한 usermanagementInmysqliscrucialforenhancingsecurityandensuringfefficientDatabaseOperation.1) USECREATEUSERTOWDDUSERS,@'localHost'or@'%'.

mysqldoes notimposeahardlimitontriggers, butpracticalfactorsdeteirefectiveuse : 1) ServerConfigurationimpactStriggerManagement; 2) 복잡한 트리거 스케일 스케일 사이드로드; 3) argertableSlowtriggerTriggerPerformance; 4) High ConconcercencyCancaUspriggerContention; 5) m

예, It 'safetostoreBlobdatainmysql, butconsidertheStefactors : 1) StoragesPace : BlobScanconSumeSignificantspace, 잠재적으로 증가하는 CostsandSlownperformance

PHP 웹 인터페이스를 통해 MySQL 사용자를 추가하면 MySQLI 확장 기능을 사용할 수 있습니다. 단계는 다음과 같습니다. 1. MySQL 데이터베이스에 연결하고 MySQLI 확장자를 사용하십시오. 2. 사용자를 생성하고 CreateUser 문을 사용하고 Password () 함수를 사용하여 암호를 암호화하십시오. 3. SQL 주입 방지 및 MySQLI_REAL_ESCAPE_STRING () 함수를 사용하여 사용자 입력을 처리하십시오. 4. 새 사용자에게 권한을 할당하고 보조금 명세서를 사용하십시오.

mysql'sblobissuilableforstoringbinarydatawithinareldatabase, whilenosqloptionslikemongodb, redis, and cassandraofferflexible, scalablesolutionsforunstuctureddata.blobissimplerbutcanslowwownperformance를 사용하는 것들보업 betterscal randaysand

TOADDAUSERINMYSQL, 사용 : CreateUser'UserName '@'host'IdentifiedBy'Password '; 여기서'showTodoitseciRely : 1) ChoosetheHostCareLyTocon trolaccess.2) setResourcelimitswithOptionslikemax_queries_per_hour.3) Usestrong, iriquepasswords.4) enforcessl/tlsconnectionswith

toavoidcommonmistakeswithstringdatatypesinmysql, stroundStringTypenuances, chooseTherightType, andManageEncodingAndCollationSettingSefectively.1) usecharforfixed-lengthstrings, varcharvariable-length, andtext/blobforlargerdata.2) setcarcatter


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Dreamweaver Mac版
시각적 웹 개발 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

WebStorm Mac 버전
유용한 JavaScript 개발 도구