MySQL InnoDBエンジンのインデックスとストレージ構造の詳細な説明

MySQL InnoDBエンジンのインデックスとストレージ構造の詳細な説明

序文

Oracle や SQL Server などのデータベースには、ストレージ エンジンが 1 つだけあり、すべてのデータ ストレージ管理メカニズムは同じです。

MySQL データベースはさまざまなストレージ エンジンを提供します。ユーザーは、さまざまな要件に応じてデータ テーブルに異なるストレージ エンジンを選択したり、ニーズに応じて独自のストレージ エンジンを作成したりできます。

MySQLの主なストレージエンジンの違い

MySQL のデフォルトのストレージ エンジンは MyISAM です。他によく使用されるものとしては、InnoDB、MERGE、MEMORY (HEAP) などがあります。

いくつかの主要なストレージエンジン

MyISAM は非トランザクション テーブルを管理し、高速なストレージと取得、および全文検索機能を提供します。

MyISAM は MySQL のデフォルトのストレージ エンジンです。 create で新しいテーブルを作成するときに、新しいテーブルのストレージ エンジンが指定されていない場合は、デフォルトで MyISAM が使用されます。各 MyISAM はディスク上の 3 つのファイルに保存されます。ファイル名はテーブル名と同じで、拡張子は .frm (テーブル定義を保存)、.MYD (MYData、データを保存)、.MYI (MYIndex、インデックスを保存) になります。データ ファイルとインデックス ファイルを異なるディレクトリに配置することで、IO を均等に分散し、速度を向上できます。

InnoDB ストレージ エンジンはトランザクション処理アプリケーションに使用され、コミット、ロールバック、クラッシュ回復機能によるトランザクションの安全性を提供する ACID トランザクション サポートなどの多くの機能を備えています。ただし、MyISAM ストレージ エンジンと比較すると、InnoDB は書き込み効率が低く、データとインデックスを保持するためにより多くのディスク領域を占有します。

メモリはすべてのデータをメモリ内に保存し、一時テーブルで使用して、参照やその他の同様のデータの迅速な検索が必要な環境で非常に高速なアクセスを提供できます。メモリはハッシュインデックスを使用するため、データアクセス速度が非常に高速です。

マージを使用すると、MySQL DBA または開発者は、同等の MyISAM テーブルを論理的にグループ化し、1 つのオブジェクトとして参照できます。データ ウェアハウスなどの VLDB 環境に非常に適しています。

さまざまなストレージエンジンの水平比較

特徴マイISAMイギリスメモリ翻訳
ストレージ制限いいえいいえ持っている64TB
取引のセキュリティサポートサポート
ロック機構テーブルロックページロックテーブルロック行ロック
Bツリーインデックスサポートサポートサポートサポート
ハッシュインデックスサポートサポート
全文索引サポート
クラスターインデックスサポート
データキャッシュサポートサポート
インデックスキャッシュサポートサポートサポート
データは圧縮できるサポート
スペースの使用低い低い該当なし高い
メモリ使用量低い低い中くらい高い
バッチ挿入速度高い高い高い低い
外部キーをサポートサポート

ストレージエンジン操作の表示と構成

1. show engines; コマンドを使用して、現在のデータベースでサポートされているストレージ エンジンを表示します。

2. テーブル定義構造やその他の情報を表示するには、次のコマンドを使用します。

Desc[ribe] tablename; //データテーブルの構造を表示します。Show create table tablename; //テーブル作成時に指定したENGINEを表示するためのテーブル作成ステートメントを表示します。
show table status like 'tablename'\G はテーブルの現在のステータス値を表示します

3. テーブルのストレージエンジンを設定または変更する

データベース テーブルを作成するときにストレージ エンジンを設定するための基本的な構文は次のとおりです。

テーブルtableName(を作成します
columnName (列名1) type (データ型) attri (属性設定)、
columnName (列名2) type (データ型) attri (属性設定)、
……..) エンジン = エンジン名

ストレージエンジンを変更するには、次のコマンドを使用します。

テーブル tableName エンジン =engineName を変更します

サーバー全体またはソリューション全体で同じストレージ エンジンを使用する必要はありません。ソリューション内の各テーブルに異なるストレージ エンジンを使用できます。

InnoDB ストレージ構造

InnoDB はページ ストレージ構造を使用します。以下は InnoDB のテーブル スペース構造図です。

ページの保存形式は次の図に示されています。

ページのストレージは次の部分で構成されます。

  1. ページ ヘッダー: ページの制御情報を記録し、ページの左右の兄弟ページ ポインター、ページ スペースの使用状況など、合計 150 バイトを占めます。ページ ヘッダーの詳細については、次の記事で説明します。
  2. 最小仮想レコードと最大仮想レコード: 固定された場所に保存される 2 つの仮想レコード。それ自体はデータを保存しません。最小の仮想レコードはどのレコードよりも小さく、最大の仮想レコードはどのレコードよりも大きくなります。
  3. レコードヒープ: 上図のオレンジ黄色の部分を指します。ページが割り当てられているレコード領域を示し、インデックス データの実際の格納領域でもあります。レコード ヒープには、有効なレコードと削除されたレコードの 2 種類があります。有効なレコードはインデックスによって通常使用されるレコードですが、削除されたレコードはインデックスから削除され、使用されなくなったレコードです (上の図の濃い青色の部分を参照)。レコードの更新と削除が頻繁に行われるようになると、レコードの山の中に削除されたレコードが増え、つまり穴(断片)が増えていきます。これらの削除されたレコードは連結され、ページの空き領域リストを形成します。
  4. 未割り当て領域: ページによって使用されていないストレージ領域を指します。ページが継続的に使用されると、未割り当て領域はますます小さくなります。新しいレコードが挿入されると、まず空き領域リストから適切な保存場所(十分なスペースがある)を取得しようとします。適切な保存場所がない場合は、未割り当て領域でそれを申請します。
  5. スロット領域: スロットは、ページの有効なレコードへのポインタです。各スロットは 2 バイトを占め、ページの最初のアドレスを基準としたレコードのオフセットを格納します。ページに n 個の有効なレコードがある場合、スロットの数は n/8+2 から n/4+2 の間になります。次のセクションでは、ページ順序の記録とバイナリ検索の鍵となるスロット領域について詳しく説明します。
  6. ページ テイラー: ページの最後の部分で、8 バイトを占め、主にページの検証情報を格納します。

ページ ヘッダー、最大/最小仮想レコード、およびページ フッターはすべて、ページ内で固定された保存場所を持ちます。

InnoDB インデックス構造

InnoDB はインデックスを保存するために B+Tree を使用します。

Innodb テーブルには複数のインデックスが含まれる場合があり、各インデックスは B+ ツリーを使用して格納されます。インデックスには、クラスター化インデックスとセカンダリ インデックスが含まれます。クラスター化インデックスは、テーブルの主キーをインデックス キーとして使用し、テーブルのすべてのフィールドを含みます。セカンダリ インデックスには、インデックス キーとクラスター化インデックス キー (プライマリ キー) の内容のみが含まれ、他のフィールドは含まれません。各インデックスは B+ ツリーです。各 B+ ツリーは多数のページで構成され、各ページのサイズは通常 16K です。 B+ ツリーの組織構造から、B ツリーのページは次のように分割できます。

リーフ ノード: B ツリーのレベル 0 にあるページで、記録されたすべてのコンテンツが格納されます。
非リーフ ノード: インデックス キーとページ ポインターのみを格納する、B ツリー レベルが 0 より大きいページ。

典型的な B+ ツリー構造:

上の図からわかるように、同じレベルのページは二重リンクリストによって接続されています。

一般的に言えば、B+ ツリーの左端のリーフ ノードから始めて右にスキャンすると、小さいものから大きいものまで B+ ツリーのすべてのデータを取得できます。したがって、リーフノードには次の特性があります。

ページ内のデータはインデックス キーによってソートされます。

ページ内の任意のレコードのインデックス キー値は、その左側の兄弟ページ内の任意のレコードの値より小さくありません。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQL の 2 つのテーブル ストレージ構造 MyISAM と InnoDB のパフォーマンス比較テスト
  • InnoDB タイプの MySql によるテーブル構造とデータの復元
  • MySQL Innodb ストレージ構造と Null 値の保存の詳細な説明
  • MySQLのInnoDBストレージエンジンのデータページ構造の詳細な説明
  • MySQL InnoDB メモリ構造の詳細

<<:  VMware12 で Ubuntu19.04 デスクトップ版をインストールする (インストール チュートリアル)

>>:  Vue ElementUI は非同期読み込みツリーを実装します

推薦する

Linux で 1 回限りのスケジュールされたタスクを実行するための at コマンドの使用に関する詳細な説明

目次序文1. 一度限りの計画タスクの紹介2. コマンド3. 1回限りのスケジュールタスクを作成する4...

MySQLはこのような更新文を決して書きません

目次序文原因現象なぜ?分析要約する序文今日は、非常に典型的な MySQL の「落とし穴」についてお話...

APPログインインターフェースシミュレーション要求を実装するためのPostmanデータ暗号化と復号化

目次主に使用されるPostmanの機能データの暗号化と復号化さまざまなパラメータ設定実際に送信された...

nginx でクロスドメイン障害修復を構成する方法の例

Nginxのクロスドメイン設定は次のようには機能しません サーバー{ 聞く 80; server_n...

MySQLユーザー削除バグを解決する

著者が MySQL を使用してユーザーを追加していたところ、ユーザー名が間違って記述されていることに...

html、xhtml、xmlの違い

開発動向: html (ハイパーテキスト マークアップ言語) - xhtml (拡張ハイパーテキスト...

最新のmysql-5.7.21のインストールと設定方法

1. ダウンロードしたMySQLの圧縮パッケージをインストールディレクトリに解凍します。 2. 新し...

Vueのリストレンダリングの詳細な説明

目次1. v-for: 配列の内容を走査する(よく使われる) 2. v-for: オブジェクトのプロ...

Vue で HTML 5 ドラッグ アンド ドロップ API を使用する方法

ドラッグ アンド ドロップ API は、ドラッグ可能な要素を HTML に追加し、ドラッグ可能な豊富...

CentOS 7.4 に MySQL 5.7 を手動でインストールする方法

MySQL データベースは、特に JAVA プログラマーの間で広く使用されています。クラウド データ...

さまざまなMySQLインデックスの使用方法の詳細な説明

1. 遅いクエリログ1.1 MySQL ログの種類ログは、データベースの操作や、ユーザーがデータベー...

nginx をプロキシ キャッシュとして使用する方法

キャッシュを使用する目的は、バックエンドの負荷を軽減し、Web サイトの同時実行性を向上させることで...

MySQL がテーブルを読み取れないエラー (MySQL 1018 エラー) の解決方法

1. エラーの再現MySQL データベースにはアクセスできますが、データベース テーブルを読み取るこ...

TypeScriptジェネリックの使用

目次1. 使いやすい2. 関数内でジェネリックを使用する3. クラス内でジェネリックを使用する4. ...

PHP で JSON バックスラッシュを削除する例

1. 「stripslashes($_POST['json']);」メソッドを使用し...