リファレンス ガイド: MySQL および MariaDB オンライン DDL
MySQL チュートリアル このコラムでは、MySQL と MariaDB Online DDL を紹介し、ガイドします。
概要
初期の MySQL バージョンでは、DDL 操作 (インデックスの作成など) には通常、データ テーブルをロックする必要がありました。プロセス中にブロックされ、通常のビジネスに影響します。 MySQL 5.6 および MariaDB 10.0 は、DML の通常の実行に影響を与えることなく DDL 操作を実行できるオンライン DDL のサポートを開始します。オンラインでの DDL 操作の直接実行は、基本的にユーザーには見えません (一部の操作はパフォーマンスに影響します)。
データベースのバージョンが異なると、さまざまな DDL ステートメントのサポートに特定の違いがあります。この記事では、オンライン DDL に対する MySQL と MariaDB のサポートについて要約します。DDL 操作を実行する必要がある場合は、この記事を参照してください。 オンライン DDL サポートセクション。
この記事は今後も改訂および更新されます。最新の内容については、GITHUB 上の私のプログラマー成長計画プロジェクトを参照してください。スターは大歓迎です。さらにエキサイティングなコンテンツについては、フォローしてください。
ALTER TABLE
ステートメントでは、オンライン DDL は ALGORITHM
ステートメントと LOCK
ステートメントを通じてサポートされています。
- - DDL 操作の実行方法と使用するアルゴリズムを制御します。
-
LOCK
- DDL -
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">ALTER TABLE tab ADD COLUMN c varchar(50), ALGORITHM=INPLACE, LOCK=NONE;复制代码</pre><div class="contentsignin">ログイン後にコピー</div></div> の実行時に許可されるテーブル ロックのレベルを制御します。
ALGORITHM サポートされるアルゴリズム
NOCOPY
アルゴリズムのサポート: MariaDB 10.3.2、MySQL はこのアルゴリズムをサポートしていません。
INSTANT
アルゴリズムのサポート: MariaDB 10.3.2、MySQL 8.0.12。
アルゴリズム使用規則:
- ユーザー指定のアルゴリズムが
COPY
の場合、InnoDB はCOPY
アルゴリズムを使用します。 - ユーザーが
COPY
以外のアルゴリズムを指定した場合、InnoDB はアルゴリズムの効率に基づいて最も効率的なアルゴリズムを選択します。最悪の場合、ユーザーが指定したアルゴリズムが使用されます。たとえば、ユーザーがALOGRITHM = NOCOPY
を指定すると、InnoDB は (NOCOPY, INSTANT) からサポートされている最も効率的なアルゴリズムを選択します。
MySQL サービスは、主に サーバー層 と ストレージ エンジン層 で構成されます。サーバー層には MySQL が含まれます。データベース: 一部のコア関数、すべての組み込み関数、ストアド プロシージャ、トリガー、ビューなどのクロスストレージ エンジン関数。ストレージ エンジン層はデータの保存と読み取りを担当し、プラグイン アーキテクチャ モデルを採用します。
COPY アルゴリズム はサーバー層で動作し、その実行プロセスはサーバー層で行われるため、すべてのストレージ エンジンがこのアルゴリズムの使用をサポートしています。実行プロセスは次のとおりです
#INPLACE アルゴリズム はストレージ エンジン層で動作し、InnoDB ストレージ エンジンの独自の DDL アルゴリズムです。実行プロセスは次の図に示されています
EXCLUSIVE > SHARED > NONE)、ステートメントの実行は失敗し、エラーが報告されます。
ENGINE | |
NOCOPY このアルゴリズムは、INPLACE アルゴリズムのサブセットであり、 | |
INSTANT は、INPLACE を回避するために使用されます。データ ファイルを変更する必要がある場合、このアルゴリズムは非常に非効率的です。 | |
为了避免执行 DDL 时,由于锁表导致生产服务不可用,在执行表结构变更语句时,可以添加
LOCK=NONE
子句,如果语句需要获取共享锁或者排它锁,则会直接报错,这样就可以避免意外锁表,造成线上服务不可用了。
Online DDL 执行过程
Online DDL 操作主要分为三个阶段:
-
阶段 1:初始化
在初始化阶段,服务器会根据存储引擎的能力,操作的语句和用户指定的
ALGORITHM
和LOCK
选项来决定允许多大程度的并发。在这个阶段会创建一个 可升级的元数据共享锁(SU)来保护表定义。 -
阶段 2:执行
这个阶段会 准备 并 执行 DDL 语句,根据 阶段 1 评估的结果来决定是否将元数据锁升级为 排它锁 (X),如果需要升级为排它锁,则只在 DDL 的 准备阶段 短暂的添加排它锁。
-
阶段 3:提交表定义
在表定义的提交阶段,元数据锁会升级为排它锁来更新表的定义。独占排它锁的持续时间非常短。
元数据锁(リファレンス ガイド: MySQL および MariaDB オンライン DDL,Metadata Lock)主要用于 DDL 和 DML 操作之间的并发访问控制,保护表结构(表定义)的一致,保证读写的正确性。リファレンス ガイド: MySQL および MariaDB オンライン DDL 不需要显式的使用,在访问表时会自动加上。
由于上面三个阶段中对元数据锁的独占, Online DDL 过程必须等待已经持有元数据锁的并发事务提交或者回滚才能继续执行。
注意:当 Online DDL 操作正在等待元数据锁时,该元数据锁会处于挂起状态,后续的所有事务都会被阻塞。在 MariaDB 10.3 之后,可以通过添加
NO WAIT
或者WAIT n
来控制等待所得超时时间,超时立即失败。
1
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]复制代码
ログイン後にコピー
评估 Online DDL 操作的性能
Online DDL 操作的性能取决于是否发生了表的重建。在对大表执行 DDL 操作之前,为了避免影响正常业务操作,最好是先评估一下 DDL 语句的性能再选择如何操作。
- 复制表结构,创建一个新的表
- 在新创建的表中插入少量数据
- 在新表上面执行 DDL 操作
- 检查执行操作后返回的
rows affected
是否是 0。如果该值非 0,则意味着需要拷贝表数据,此时对 DDL 的上线需要慎重考虑,周密计划
比如
-
修改某一列的默认值(快速,不会影响到表数据)
1
Query OK, 0 rows affected (0.07 sec)复制代码
ログイン後にコピー -
添加索引(需要花费一些时间,但是
0 rows affected
说明没有发生表拷贝)1
Query OK, 0 rows affected (21.42 sec)复制代码
ログイン後にコピー -
修改列的数据类型(需要花费很长时间,并且重建表)
1
Query OK, 1671168 rows affected (1 min 35.54 sec)复制代码
ログイン後にコピー
由于在执行 Online DDL 过程中需要记录并发执行的 DML 操作发生的变更,然后在执行完 DDL 操作之后再应用这些变更,因此使用 Online DDL 操作花费的时间比不使用 Online 模式执行要更长一些。
Online DDL 支持情况
INSTANT
算法支持:MariaDB 10.3.2+,MySQL 8.0.12+。NOCOPY
只支持 MariaDB 10.3.2 以上版本,不支持 MySQL,这里就暂且忽略了。
重点关注是否 重建表 和 支持并发 DML:不需要重建表,支持并发 DML 最佳。
セカンダリ インデックス
現在の操作でサポートされる最小の粒度ロック ポリシー | |
テーブル ロックを取得せず、すべての DML 操作を許可します | |
共有ロック (読み取りロック) をテーブルに追加し、読み取り専用の DML 操作のみを許可します | |
排他ロックをテーブルに追加します。テーブル (書き込みロック)、DML 操作は許可されません |
操作 | INSTANT | INPLACE | テーブルの再構築 | 同時実行DML | メタデータのみを変更します |
---|---|---|---|---|---|
セカンダリ インデックスを作成または追加します | ❌ | ✅ | ❌ | ✅ | ❌ |
インデックスを削除 | ❌ | ✅ | ❌ | ||
#❌ | ✅ | ❌ | ✅ | ✅ | |
インデックスを追加 ❌ |
✅ ① | ❌ ① | ❌ | ❌ | |
インデックス (⚠️MySQL 5.7、MariaDB 10.2.2) ❌ |
✅ | ❌ | ❌ | ❌ | |
##❌ | ✅ | ✅ |
- 主キー
INPLACE | テーブルの再構築 | 同時 DML | #主キーの追加 | ||
---|---|---|---|---|---|
✅ ② | #プライマリキーを削除 | ❌ | ❌ | ||
❌ | ❌ | ||||
クラスター化インデックスの再構築には常にテーブル データのコピーが必要です (InnoDB は「インデックス構成テーブル」です)。したがって、テーブルの作成時に主キーを定義することが最善です。主キーを指定せずにテーブルが作成された場合、InnoDB は最初の |
INPLACE
モードを使用します。- COPY
- モードよりも効率的です。 undo ログ
- および
redo ログ
は生成されず、セカンダリ インデックスは順序付けされているため、順番にロードできます。変更バッファを使用する必要はありません。 通常の列 -
操作 INSTANTINPLACE
##✅ | ❌ ③ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
❌ ④ | ✅ | ✅ | ✅ | ❌ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#✅ ⑤ | ✅ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
VARCHAR | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#列のデフォルト値を削除 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
##❌# #✅
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
および | 列 | ✅ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
❌ ⑩ | ✅ | ✅ |
説明:
注:
テーブル
⑮⑯ 文字セットが異なる場合、テーブルを再構築する必要があります。
(ビデオ) |
以上がリファレンス ガイド: MySQL および MariaDB オンライン DDLの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホット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
ビジュアル Web 開発ツール

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

ホットトピック











Laravelは、Webアプリケーションを簡単に構築するためのPHPフレームワークです。次のような強力な機能を提供します。インストール:Laravel CLIを作曲家にグローバルにインストールし、プロジェクトディレクトリにアプリケーションを作成します。ルーティング:ルート/web.phpのURLとハンドラーの関係を定義します。ビュー:リソース/ビューでビューを作成して、アプリケーションのインターフェイスをレンダリングします。データベース統合:MySQLなどのデータベースとのすぐ外側の統合を提供し、移行を使用してテーブルを作成および変更します。モデルとコントローラー:モデルはデータベースエンティティを表し、コントローラーはHTTP要求を処理します。

MySQLとPHPMyAdminは、強力なデータベース管理ツールです。 1)MySQLは、データベースとテーブルを作成し、DMLおよびSQLクエリを実行するために使用されます。 2)PHPMyAdminは、データベース管理、テーブル構造管理、データ操作、ユーザー許可管理のための直感的なインターフェイスを提供します。

他のプログラミング言語と比較して、MySQLは主にデータの保存と管理に使用されますが、Python、Java、Cなどの他の言語は論理処理とアプリケーション開発に使用されます。 MySQLは、データ管理のニーズに適した高性能、スケーラビリティ、およびクロスプラットフォームサポートで知られていますが、他の言語は、データ分析、エンタープライズアプリケーション、システムプログラミングなどのそれぞれの分野で利点があります。

小さなアプリケーションを開発する際には、軽量データベース操作ライブラリをすばやく統合する必要性という厄介な問題に遭遇しました。複数のライブラリを試した後、私はそれらがあまりにも多くの機能を持っているか、あまり互換性がないかのどちらかであることがわかりました。最終的に、私は問題を完全に解決したYii2に基づいた単純化されたバージョンであるMinii/DBを見つけました。

記事の概要:この記事では、Laravelフレームワークを簡単にインストールする方法について読者をガイドするための詳細なステップバイステップの指示を提供します。 Laravelは、Webアプリケーションの開発プロセスを高速化する強力なPHPフレームワークです。このチュートリアルは、システム要件からデータベースの構成とルーティングの設定までのインストールプロセスをカバーしています。これらの手順に従うことにより、読者はLaravelプロジェクトのための強固な基盤を迅速かつ効率的に築くことができます。

Theliaを使用してeコマースWebサイトを開発するとき、私はトリッキーな問題に遭遇しました:MySQLモードが適切に設定されていないため、いくつかの機能が適切に機能しません。いくつかの調査の後、TheliamysQlModescheckerというモジュールを見つけました。これは、Theliaが必要とするMySQLパターンを自動的に修正できるため、問題を完全に解決できます。

MySQLでは、外部キーの機能は、テーブル間の関係を確立し、データの一貫性と整合性を確保することです。外部キーは、参照整合性チェックとカスケード操作を通じてデータの有効性を維持します。パフォーマンスの最適化に注意し、それらを使用するときに一般的なエラーを避けてください。

MySQLとMariaDBの主な違いは、パフォーマンス、機能、ライセンスです。1。MySQLはOracleによって開発され、Mariadbはフォークです。 2. Mariadbは、高負荷環境でパフォーマンスを向上させる可能性があります。 3.MariaDBは、より多くのストレージエンジンと機能を提供します。 4.MySQLは二重ライセンスを採用し、MariaDBは完全にオープンソースです。既存のインフラストラクチャ、パフォーマンス要件、機能要件、およびライセンスコストを選択する際に考慮する必要があります。
