InnoDB联机修改表对象结构
联机修改表对象结构: 在MySQL5.6之前 1.创建一个结构与原表对象完全相同的临时表(隐式操作,该对象用户不可见),并将该表的结构
联机修改表对象结构:
在MySQL5.6之前
1.创建一个结构与原表对象完全相同的临时表(隐式操作,该对象用户不可见),并将该表的结构修改为期望的结构
2.锁定原表,只许查询,不许修改
3.将原表数据复制到新创建的临时表,类似insert into new_tb select * from old_tb;
4.将原表重命名,新创建的临时表名称修改为正式表名,之后释放锁定,删除原表
在MySQL5.6以后,联机DDL修改InnoDB表提供有限支持
就地进行In-Place,表示修改操作可以直接在该表对象上执行
复制表Copies Tables,表示需要复制整个表才能执行修改操作
用户可以通过ALTER TABLE语句中的LOCK和ALGORITHM两个子句,来明确控制联机DDL时的操作行为。LOCK子句对于表并行读控制的微调比较有效,而ALGORITHM子句则对于操作时的性能和操作策略有较大影响
LOCK有4个选项值:
DEFAULT:默认处理策略,等同于不指定LOCK子句
NONE:不使用锁定策略,其他会话既能读也能写
SHARED:采取共享策略,其他会话可读但不可写
EXCLUSIVE:采取排他锁定,其他会话既不能读也不能写
ALGORITHM有3个选项值:
DEFAULT:相当于不指定ALGORITHM子句
INPLACE:如果支持就直接修改,不支持就报错
COPY:不管是否支持就地修改,都采取将表对象中数据新复制一份的方式修改
如果希望并发粒度最高,那么就要指定LOCK=NONE(可读可写),若希望操作成本最低,最好指定ALGORITHM=INPLACE(直接对对象进行操作,涉及读写的数据量最小)
联机DDL测试:
登录到mysql,执行对象创建脚本
use hugcdb;
set autocommit=0;
create table t_idb_big as select * from information_schema.columns;
insert into t_idb_big select * from t_idb_big;
insert into t_idb_big select * from t_idb_big;
insert into t_idb_big select * from t_idb_big;
insert into t_idb_big select * from t_idb_big;
insert into t_idb_big select * from t_idb_big;
insert into t_idb_big select * from t_idb_big;
insert into t_idb_big select * from t_idb_big;
alter table t_idb_big add id int unsigned not null primary key auto_increment;
select count(*) from t_idb_big;
1.测试增/删索引
使用INPLACE方式效率非常高
du –k /data/mysqldata/3306/data/hugcdb/t_idb_big.ibd
alter table t_idb_big add index ind_data_type (data_type),algorithm=inplace;
du –k /data/mysqldata/3306/data/hugcdb/t_idb_big.ibd
alter table t_idb_big drop index ind_data_type,algorithm=inplace;
使用COPY方式效率较低
create index ind_data_type on t_idb_big(data_type) alogorithm=copy;
du –k /data/mysqldata/3306/data/hugcdb/t_idb_big.ibd
drop index ind_data_type on t_idb_big alogorithm=copy;
2.测试增/删索引过程中DML操作
增加表中数据
alter table t_idb_big drop id;
insert into t_idb_big select * from t_idb_big;
insert into t_idb_big select * from t_idb_big;
insert into t_idb_big select * from t_idb_big;
insert into t_idb_big select * from t_idb_big;
insert into t_idb_big select * from t_idb_big;
insert into t_idb_big select * from t_idb_big;
alter table t_idb_big add id int unsigned not null primary key auto_increment;
首先测试传统方式修改表结构,在第一个会话中执行DDL语句
set old_alter_table=1;
create index ind_tablename on t_idb_big(table_name);
在另一个会话执行下列操作
set autocommit=0;
use hugcdb;
select count(*) from t_idb_big where table_name=’FILES’;
delete from t_idb_big where table_name=’FILES’;
rollback;
语句被阻塞
引入联机DDL方式,在第一个会话中执行
set old_alter_table=0;
create index ind_tablename on t_idb_big(table_name) algorithm=inplace;
在另一个会话执行下列操作
select count(*) from t_idb_big where table_name=’FILES’;
delete from t_idb_big where table_name=’FILES’;
rollback;
3.测试修改列
通过COPY机制修改列
alter table t_idb_big change nullable is_unllable varchar(3),algorithm=copy;
联机DDL方式修改列
alter table t_idb_big change nullable is_unllable varchar(3),algorithm=inplace;
4.测试修改自增列
传统方式修改
alter table t_idb_big auto_increment=1000000,algorithm=copy;很慢
连接DDL方式修改
alter table t_idb_big auto_increment=1000000,algorithm=inplace;很快
不仅不需要重建对象,而且只需要修改.frm文件中的标记和内存中的自增值,,完全不需要动表中的数据
5.测试LOCK子句控制并行DML
show processlist;
ID列用于标识会话,Command列用于标识该会话指定的命令类型(比如说查询、空闲等),State列标识该会话当前的状态,Info列标识该会话当前执行的操作,如果为NULL,则说明该会话当前是空闲状态,重点关注State列和Info列
MySQL InnoDB存储引擎锁机制实验
InnoDB存储引擎的启动、关闭与恢复
MySQL InnoDB独立表空间的配置
MySQL Server 层和 InnoDB 引擎层 体系结构图
InnoDB 死锁案例解析
MySQL Innodb独立表空间的配置
本文永久更新链接地址:

핫 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)

뜨거운 주제











Apple의 최신 iOS18, iPadOS18 및 macOS Sequoia 시스템 릴리스에는 사진 애플리케이션에 중요한 기능이 추가되었습니다. 이 기능은 사용자가 다양한 이유로 손실되거나 손상된 사진과 비디오를 쉽게 복구할 수 있도록 설계되었습니다. 새로운 기능에는 사진 앱의 도구 섹션에 '복구됨'이라는 앨범이 도입되었습니다. 이 앨범은 사용자가 기기에 사진 라이브러리에 포함되지 않은 사진이나 비디오를 가지고 있을 때 자동으로 나타납니다. "복구된" 앨범의 출현은 데이터베이스 손상으로 인해 손실된 사진과 비디오, 사진 라이브러리에 올바르게 저장되지 않은 카메라 응용 프로그램 또는 사진 라이브러리를 관리하는 타사 응용 프로그램에 대한 솔루션을 제공합니다. 사용자는 몇 가지 간단한 단계만 거치면 됩니다.

Hibernate 다형성 매핑은 상속된 클래스를 데이터베이스에 매핑할 수 있으며 다음 매핑 유형을 제공합니다. Join-subclass: 상위 클래스의 모든 열을 포함하여 하위 클래스에 대한 별도의 테이블을 생성합니다. 클래스별 테이블: 하위 클래스별 열만 포함하는 하위 클래스에 대한 별도의 테이블을 만듭니다. Union-subclass: Joined-subclass와 유사하지만 상위 클래스 테이블이 모든 하위 클래스 열을 통합합니다.

MySQLi를 사용하여 PHP에서 데이터베이스 연결을 설정하는 방법: MySQLi 확장 포함(require_once) 연결 함수 생성(functionconnect_to_db) 연결 함수 호출($conn=connect_to_db()) 쿼리 실행($result=$conn->query()) 닫기 연결( $conn->close())

HTML은 데이터베이스를 직접 읽을 수 없지만 JavaScript 및 AJAX를 통해 읽을 수 있습니다. 단계에는 데이터베이스 연결 설정, 쿼리 보내기, 응답 처리 및 페이지 업데이트가 포함됩니다. 이 기사에서는 JavaScript, AJAX 및 PHP를 사용하여 MySQL 데이터베이스에서 데이터를 읽는 실제 예제를 제공하고 쿼리 결과를 HTML 페이지에 동적으로 표시하는 방법을 보여줍니다. 이 예제에서는 XMLHttpRequest를 사용하여 데이터베이스 연결을 설정하고 쿼리를 보내고 응답을 처리함으로써 페이지 요소에 데이터를 채우고 데이터베이스를 읽는 HTML 기능을 실현합니다.

PHP에서 데이터베이스 연결 오류를 처리하려면 다음 단계를 사용할 수 있습니다. mysqli_connect_errno()를 사용하여 오류 코드를 얻습니다. 오류 메시지를 얻으려면 mysqli_connect_error()를 사용하십시오. 이러한 오류 메시지를 캡처하고 기록하면 데이터베이스 연결 문제를 쉽게 식별하고 해결할 수 있어 애플리케이션이 원활하게 실행될 수 있습니다.

Go 표준 라이브러리 데이터베이스/sql 패키지를 통해 MySQL, PostgreSQL 또는 SQLite와 같은 원격 데이터베이스에 연결할 수 있습니다. 데이터베이스 연결 정보가 포함된 연결 문자열을 생성합니다. sql.Open() 함수를 사용하여 데이터베이스 연결을 엽니다. SQL 쿼리 및 삽입 작업과 같은 데이터베이스 작업을 수행합니다. 리소스를 해제하기 위해 defer를 사용하여 데이터베이스 연결을 닫습니다.

Golang의 데이터베이스 콜백 기능을 사용하면 다음을 달성할 수 있습니다. 지정된 데이터베이스 작업이 완료된 후 사용자 정의 코드를 실행합니다. 추가 코드를 작성하지 않고도 별도의 함수를 통해 사용자 정의 동작을 추가할 수 있습니다. 삽입, 업데이트, 삭제, 쿼리 작업에 콜백 함수를 사용할 수 있습니다. 콜백 함수를 사용하려면 sql.Exec, sql.QueryRow, sql.Query 함수를 사용해야 합니다.

JSON 데이터는 gjson 라이브러리 또는 json.Unmarshal 함수를 사용하여 MySQL 데이터베이스에 저장할 수 있습니다. gjson 라이브러리는 JSON 필드를 구문 분석하는 편리한 방법을 제공하며, json.Unmarshal 함수에는 JSON 데이터를 비정렬화하기 위한 대상 유형 포인터가 필요합니다. 두 방법 모두 SQL 문을 준비하고 삽입 작업을 수행하여 데이터를 데이터베이스에 유지해야 합니다.
