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 は非同期読み込みツリーを実装します

推薦する

MySQL の起動時に InnoDB エンジンが無効になる問題の解決方法

問題を見つける今日、仕事中に、ローカル データベースから仮想マシン CentOS 6.6 上のデータ...

ポップアップはすべて不正なものではありません。ウェブサイトのポップアップをデザインするためのヒント

ポップアップニュースは国内のインターネットサービスでは一般的であり、リアルタイムプッシュ方式はウェブ...

Vue3カプセル化メッセージメッセージプロンプトインスタンス関数の詳細な説明

目次Vue3 カプセル化メッセージプロンプトインスタンス関数スタイルレイアウトカプセル化メッセージ....

アニメーション効果のようなVueトランジションの例

目次結果を一目で見るハート効果デジタルスクロールアニメーションアニメーションのように結果を一目で見る...

仮想マシンクローン Linux centos6.5 システム ネットワーク カード構成グラフィック チュートリアル

Linux システムに触れたばかりの初心者として、VMware 仮想マシンに CentOS6.5 シ...

MySQL シリーズ 12 バックアップとリカバリ

目次チュートリアルシリーズ1. バックアップ戦略の説明1. バックアップの種類2. バックアップで考...

MySQLテーブルのテーブル構造を素早く変更する方法

MySQL テーブルのテーブル構造をすばやく変更する - 「MySQL 管理」から抜粋 ALTER ...

Vue3を使用してjsで呼び出せるコンポーネントを実装する

目次序文1. 従来のVueコンポーネント1. メインコンポーネントコード: 2. 使用方法3. 成果...

Docker で Redis クラスターを素早く構築する方法の例

Redis クラスターとはRedis クラスターは、R​​edis が提供する分散データベース ソリ...

nginxのインストールと設定の詳細なプロセス記録

目次1 nginxの紹介1 nginxとは何か2 つのアプリケーション シナリオ2 nginxのイン...

jsはフォーム検証機能を実装します

この記事の例では、フォーム検証機能を実装するためのjsの具体的なコードを参考までに共有しています。具...

テーブルはセルとimg画像を結合してtd HTML全体を埋めます

ソースコード(一部のクラスは削除されています):コードをコピーコードは次のとおりです。 <テー...

DockerにTomcat8をインストールする方法

1. dockerでtomcat8をインストールする1. Docker HubでTomcatイメージ...

MIME TYPEとは?MIME-Typesタイプコレクション

MIME タイプとは何ですか? 1. まず、ブラウザがコンテンツを処理する方法を理解する必要がありま...

Dockerコンテナでルート権限を取得する方法

まず、コンテナが稼働している必要がありますコンテナのCONTAINER IDは、sudo docke...