MySQL innodb_autoinc_lock_mode について

MySQL innodb_autoinc_lock_mode について

innodb_autoinc_lock_mode パラメータは、auto_increment 列を持つテーブルにデータを挿入するときの関連ロックの動作を制御します。

設定することで、パフォーマンスとセキュリティ(マスターとスレーブ間のデータ一貫性)のバランスをとることができます。

【0】まずは挿入物を分類してみましょう

まず、インサートは大きく分けて3つのカテゴリに分けられます。

1. insert into t(name) values('test') のような単純な挿入

2. load data | insert into ... select .... from .... などの一括挿入

3. insert into t(id,name) values(1,'a'),(null,'b'),(5,'c'); などの混合挿入

【1】innodb_autoinc_lock_modeの説明

innodb_auto_lockmode には 3 つの値があります。

1, 0 これは伝統を意味する

2. 1 これは連続した

3.2 これはインターリーブを意味します

【1.1】tradition(innodb_autoinc_lock_mode=0)モード:

1. 下位互換性機能を提供する

2. このモードでは、すべての挿入ステートメント (「挿入のような」) は、ステートメントの開始時にテーブル レベルの auto_inc ロックを取得し、ステートメントの終了時にロックを解除する必要があります。これは、トランザクション レベルではなく、ステートメント レベルを参照することに注意してください。トランザクションには、1 つ以上のステートメントが含まれる場合があります。

3. 値の分配の予測可能性、継続性、再現性を確保できるため、挿入ステートメントがスレーブにコピーされるときにマスターと同じ値を生成できることが保証されます (ステートメントベースのレプリケーションのセキュリティが確保されます)。

4. このモードでは、auto_inc ロックがステートメントの最後まで保持されるため、同時挿入に影響します。

[1.2] 連続(innodb_autoinc_lock_mode=1)モード:

1. このモードでは、単純な挿入が最適化されます。一度に挿入される値の数がすぐに判断できるため、MySQL はこの挿入ステートメントに対して一度に複数の連続した値を生成できます。一般に、これはレプリケーションにも安全です (ステートメントベースのレプリケーションの安全性を保証します)。

2. このモードは MySQL のデフォルト モードでもあります。このモードの利点は、auto_inc ロックがステートメントの最後まで残らないことです。ステートメントが対応する値を取得する限り、ロックを事前に解除できます。

【1.3】インターリーブ(innodb_autoinc_lock_mode=2)モード

1. このモードでは auto_inc ロックがないため、このモードでのパフォーマンスは最高です。ただし、同じステートメントに対して取得される auto_incremant 値が連続しない可能性があるという問題もあります。

【2】バイナリファイル形式が混合|行の場合、これら3つの値はいずれも安全にコピーできます。

MySQL では現在、バイナリ形式を行に設定することを推奨しているため、binlog_format がステートメントでない場合は innodb_autoinc_lock_mode=2 に設定するのが最適で、これによりパフォーマンスが向上する可能性があります。

最後に、auto_incrementの例で終わりましょう。

例:理由もなく auto_increment 列の値を更新しない

ステップ1: シーンを再現する

テーブル t(x int auto_increment not null 主キー) を作成します。
t(x)に値(0),(null),(3)を挿入します。
t から * を選択します。
+---+
| バツ |
+---+
| 1 |
| 2 |
| 3 |
+---+

ステップ2: 問題の原因となったSQLを再現する

tを更新し、x=1の場合にx=4に設定します。
t から * を選択します。
+---+
| バツ |
+---+
| 2 |
| 3 |
| 4 |
+---+

ステップ3: 通常のパフォーマンスを再現する

t(x) に値(0) を挿入します。
エラー 1062 (23000): キー 'PRIMARY' のエントリ '4' が重複しています

ステップ4: 問題の概要

最初のステップを実行すると、MySQL は次の auto_increment 値が 4 であることを認識します。

2 番目のステップを実行すると、MySQL は 4 が手動で占有されたことを認識しないため、3 番目のステップを実行するとエラーが発生します。

MySQL innodb_autoinc_lock_mode について紹介したのは以上です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • InnoDB タイプの MySql によるテーブル構造とデータの復元
  • MySQL の起動時に InnoDB エンジンが無効になる問題の解決方法
  • mysql は sql ファイルを実行し、エラーを報告します エラー: 不明なストレージ エンジン 'InnoDB' ソリューション
  • MySQL innodb例外の修復に関する経験の共有
  • MySQL InnoDB 監視 (システム層、データベース層)
  • MySQLでMyISAMストレージエンジンをInnodbに変更した操作記録のまとめ
  • MySQL の最適化: InnoDB の最適化
  • MySQLストレージエンジンのMyISAMとInnoDBの違いを詳しく説明
  • MySQL は InnoDB 機能が無効になっているため、InnoDB を有効にする必要があるというメッセージを表示します。解決策
  • Innodb トランザクション分離レベルと MySQL のロックの関係に関するチュートリアル
  • MySQL の InnoDB ストレージ ファイルの詳細な説明

<<:  1 つ以上の Linux インスタンスから SSH キー ペアのバインドを解除します。

>>:  JavaScriptにおけるこれの深い理解

推薦する

MySQL 5.7 をインストールした後にコマンドライン ウィンドウを開くとクラッシュする問題の解決方法

序文最近、MySQL 5.7 をインストールしましたが、問題が見つかりました。コマンド ライン ウィ...

ドラッグ可能なログインボックスを実現するネイティブJS

この記事では、ネイティブ JS で実装されたドラッグ可能なログイン ボックスを紹介します。その効果は...

HTML で JavaScript の全選択/全選択解除操作を実行するサンプル コード

コードをコピーコードは次のとおりです。 <html> <ヘッド> <m...

Keepalived は Nginx の負荷分散と高可用性のサンプル コードを実装します

第1章: keepalivedの紹介VRRP プロトコルの目的は、静的ルーティングの単一点障害問題を...

CSS のグリッドプロパティの使用に関する詳細な説明

グリッドレイアウト親要素に追加された属性グリッドテンプレートの列/グリッドテンプレートの行要素の行ま...

jQueryをベースにカルーセル効果を実現する

この記事では、カルーセルマップの効果を実現するためのjQueryの具体的なコードを参考までに共有しま...

アーティストの自己啓発におけるいくつかの経験

会社の影響力が拡大し、製品が改良され続けるにつれて、関連するイメージデザインもそれに追いつき、徐々に...

CentOS 環境で NFS リモート ディレクトリ マウントを使用する手順の紹介

目次1. NFS の概要2. NFS構築1. NFSサーバーの構築2. NFSクライアントの構築3....

Vue uniapp はセグメンター効果を実現します

この記事では、セグメンター効果を実現するためのvue uniappの具体的なコードを参考までに共有し...

スタイル属性 (element.style) で定義されたインライン スタイルを削除する方法

Magento を頻繁に変更する場合、element.style に遭遇することがあります。 これは...

MySQLを使用して列内の異なる値の数をカウントする例

序文この記事で実装されている要件は、実際には非常に一般的です。たとえば、ユーザーが登録したチャネルを...

Vue の高度なコンポーネント機能コンポーネントの使用シナリオとソースコード分析

目次導入使用シナリオソースコード分析要約する導入Vue は、コンポーネントをステートレスかつインスタ...

Linux のリンク解除機能とファイルの削除方法

1. リンク解除機能ハード リンクの場合、unlink はディレクトリ エントリを削除し、inode...

Vueソースコード解析における仮想DOMの詳しい説明

なぜ仮想DOMが必要なのでしょうか?仮想 DOM はブラウザのパフォーマンス問題を解決するために設計...

CentOS 7.x に ZSH ターミナルをインストールする方法

1. 基本コンポーネントをインストールするまず、 yumコマンドを実行して、コードpullために必要...