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衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go 言語は、効率的かつ簡潔で習得が容易なプログラミング言語であり、同時プログラミングやネットワーク プログラミングに優れているため、開発者に好まれています。実際の開発ではデータベースの操作が欠かせませんが、今回はGo言語を使ってデータベースの追加・削除・変更・クエリ操作を実装する方法を紹介します。 Go 言語では、データベースを操作するために通常、よく使用される SQL パッケージや gorm などのサードパーティ ライブラリを使用します。ここでは SQL パッケージを例として、データベースの追加、削除、変更、クエリ操作を実装する方法を紹介します。 MySQL データベースを使用していると仮定します。

Hibernate ポリモーフィック マッピングは、継承されたクラスをデータベースにマップでき、次のマッピング タイプを提供します。 join-subclass: 親クラスのすべての列を含む、サブクラス用の別個のテーブルを作成します。 table-per-class: サブクラス固有の列のみを含む、サブクラス用の別個のテーブルを作成します。 Union-subclass: join-subclass と似ていますが、親クラス テーブルがすべてのサブクラス列を結合します。

Apple の最新リリースの iOS18、iPadOS18、および macOS Sequoia システムでは、さまざまな理由で紛失または破損した写真やビデオをユーザーが簡単に回復できるように設計された重要な機能が写真アプリケーションに追加されました。この新機能では、写真アプリのツール セクションに「Recovered」というアルバムが導入され、ユーザーがデバイス上に写真ライブラリに含まれていない写真やビデオがある場合に自動的に表示されます。 「Recovered」アルバムの登場により、データベースの破損、カメラ アプリケーションが写真ライブラリに正しく保存されない、または写真ライブラリを管理するサードパーティ アプリケーションによって失われた写真やビデオに対する解決策が提供されます。ユーザーはいくつかの簡単な手順を実行するだけで済みます

HTML はデータベースを直接読み取ることはできませんが、JavaScript と AJAX を通じて実現できます。この手順には、データベース接続の確立、クエリの送信、応答の処理、ページの更新が含まれます。この記事では、JavaScript、AJAX、および PHP を使用して MySQL データベースからデータを読み取る実践的な例を示し、クエリ結果を HTML ページに動的に表示する方法を示します。この例では、XMLHttpRequest を使用してデータベース接続を確立し、クエリを送信して応答を処理することで、ページ要素にデータを埋め込み、データベースを読み取る HTML の機能を実現します。

PHP でデータベース接続エラーを処理するには、次の手順を使用できます。 mysqli_connect_errno() を使用してエラー コードを取得します。 mysqli_connect_error() を使用してエラー メッセージを取得します。これらのエラー メッセージをキャプチャしてログに記録することで、データベース接続の問題を簡単に特定して解決でき、アプリケーションをスムーズに実行できるようになります。

MySQLi を使用して PHP でデータベース接続を確立する方法: MySQLi 拡張機能を含める (require_once) 接続関数を作成する (functionconnect_to_db) 接続関数を呼び出す ($conn=connect_to_db()) クエリを実行する ($result=$conn->query()) 閉じる接続 ( $conn->close())

PHP は Web サイト開発で広く使用されているバックエンド プログラミング言語であり、強力なデータベース操作機能を備えており、MySQL などのデータベースとの対話によく使用されます。ただし、中国語の文字エンコーディングは複雑であるため、データベース内で中国語の文字化けを処理するときに問題が発生することがよくあります。この記事では、文字化けの一般的な原因、解決策、具体的なコード例を含め、データベース内の中国語の文字化けを処理するための PHP のスキルと実践方法を紹介します。文字化けの一般的な原因は、データベースの文字セット設定が正しくないことです。データベースの作成時に、utf8 や u などの正しい文字セットを選択する必要があります。

Golang でデータベース コールバック関数を使用すると、次のことを実現できます。 指定されたデータベース操作が完了した後にカスタム コードを実行します。追加のコードを記述せずに、個別の関数を通じてカスタム動作を追加します。コールバック関数は、挿入、更新、削除、クエリ操作に使用できます。コールバック関数を使用するには、sql.Exec、sql.QueryRow、または sql.Query 関数を使用する必要があります。
