記事ディレクトリ
序文
多くの学生は MySQL を独自のデータベースとして使用していますが、SQL ステートメントといくつかの ORM 記述メソッドを最もよく使用している可能性がありますが、基礎となる実装についてはあまり知りません。たとえば、上記の質問では、InnoDB と MyISAM がそれぞれ何であるかがあまり明確ではない可能性があります。ただし、一部の大企業(テンセントなど)の面接質問では、このような質問が頻繁に出てくる場合があるため、このような質問を正しく理解することが非常に重要です。
実際、InnoDB と MyISAM は MySQL の 2 つの「ストレージ エンジン」です。
1. データベースストレージエンジン
データベース ストレージ エンジンはデータベースの基礎となるソフトウェア組織であり、データベース管理システム (DBMS) はデータ エンジンを使用してデータの作成、クエリ、更新、削除を行います。ストレージ エンジンが異なれば、ストレージ メカニズム、インデックス作成手法、ロック レベル、その他の機能も異なります。また、ストレージ エンジンが異なると、特定の機能を取得することもできます。
次に、データベースがどのエンジンを使用しているかをどうやって知るのでしょうか?
SHOW ENGINES;
3. ストレージエンジンの原理
まず、面接で尋ねられる可能性のある「MyISAM エンジンと InnoDB エンジンで使用されるインデックスのデータ構造は何ですか」という質問に答えます。
どちらも B+ ツリーですが、違いは次のとおりです。
- MyISAM の B+ ツリーのデータ構造に格納される内容は実データのアドレス値であり、そのインデックスは実データとは別ですが、実データを指すためにインデックスが使用されます。このタイプのインデックスは非クラスター化インデックスと呼ばれます。
- 実際のデータはInnoDB の B+ ツリーのデータ構造に格納され、この種のインデックスはクラスター化インデックスと呼ばれます。
4. B ツリーと B+ ツリー
では、B+ ツリーとは何でしょうか?
B+ ツリーは B ツリーのバリアントであり、B ツリーの場合は次のようになります。
B ツリーは、バランス型マルチウェイ検索ツリーとも呼ばれるマルチフォーク ツリーに属し、そのルールは次のとおりです。
- すべてのノードのキーワードは昇順に配置され、左が小さく右が大きいという原則に従います。
- 子ノードの数: 空のツリーを除く、非リーフ ノードの子ノードの数>1、<=M、および M>=2 (注: M 次はツリー ノードに最大でいくつの検索パスがあるかを表し、M=2 が二分木、M=3 が 3 分岐の場合は M=M パス)
- キーワードの数: ブランチ ノード内のキーワードの数は ceil(m/2)-1 以上、M-1 以下です (注: ceil() は、正の無限大に向かって丸める関数です。たとえば、ceil(1.1) の結果は 2 になります)
- リーフ ノードのポインタは null であり、リーフ ノードの深さは同じです
そして B+ ツリーの場合:
- B+ ツリーは B ツリーのアップグレード版で、B ツリーと比較してノード空間を最大限に活用することでクエリ速度がより安定し、その速度は完全に二分探索に近づきます。
5.マイサム
MyISAM に戻ると、MyISAM のインデックス構造は次の図に示されています。これは、MyISAM のインデックス ファイルはデータ レコードのアドレスのみを保存するためです。MyISAM では、プライマリ インデックスとセカンダリ インデックス (セカンダリ キー) の構造に違いはありません。MyISAM のインデックス
検索アルゴリズムは、まず B+Tree 検索アルゴリズムに従ってインデックスを検索します。指定された Key が存在する場合は、そのデータ フィールドの値を取り出し、次にデータ フィールドの値をアドレスとして使用して、対応するデータ レコードを読み取ります。
6. InnoDB
InnoDB の場合、テーブル データ ファイル自体は B+Tree によって編成されたインデックス構造であり、このツリーのリーフ ノード データ ドメインには完全なデータ レコードが格納されます。
InnoDB はデータベースの主キーをインデックス キーとして使用するため、InnoDB データ テーブル ファイル自体が主インデックスであり、InnoDB データ ファイルは主キーに従って集計する必要があるため、InnoDB をデータ エンジンとして使用するテーブルには主キーが必要です。明示的に指定されていない場合、MySQL はデータを一意に識別できるカラムを主キーとして自動的に選択しようとします。それが見つからない場合は、暗黙的なフィールドが主キーとして生成されます。このフィールドの長さは 6 バイトで、タイプは長整数です。
7. InnoDB と MyISAM の違い
-
InnoDB はトランザクションをサポートしていますが、MyISAM はサポートしていません。InnoDB の場合、各 SQL 言語はデフォルトでトランザクションにカプセル化され、自動的に送信されます。これは速度に影響するため、トランザクションを形成するには開始とコミットの間に複数の SQL 言語を入れるのが最善です。
-
InnoDB は外部キーをサポートしますが、MyISAM はサポートしません。外部キーを含む InnoDB テーブルを MYISAM に変換すると失敗します。
-
InnoDB はクラスター化インデックスです。データ ファイルはインデックスに関連付けられており、主キーが必要です。主キーによるインデックス作成の効率は非常に高くなります。ただし、補助インデックスには 2 つのクエリが必要です。最初に主キーがクエリされ、次に主キーを介してデータがクエリされます。したがって、主キーが大きすぎると、他のインデックスも大きくなるため、主キーは大きすぎないでください。また、MyISAM は非クラスター化インデックスであり、データ ファイルが分離されており、インデックスにはデータ ファイルのポインタが格納されます。主キーインデックスと副キーインデックスは独立しています。
-
InnoDB はテーブルに特定の行数を保存せず、select count(*) from table を実行するときにテーブル全体のスキャンを必要とします。ただし、MyISAM では変数を使用してテーブル全体の行数を保存するため、上記のステートメントを実行するときは変数を読み取るだけで済み、処理速度は非常に高速です。
-
Innodb はフルテキスト インデックス作成をサポートしていませんが、MyISAM はフルテキスト インデックス作成をサポートしており、MyISAM はクエリ効率が高くなります。
マイISAM | InnoDB | |
---|---|---|
組成の違い: | 各 MyISAM はディスク上に 3 つのファイルとして保存されます。最初のファイルの名前はテーブルの名前で始まり、拡張子はファイルの種類を示します。.frm ファイルにはテーブル定義が保存されます。データ ファイルの拡張子は .MYD (MYData) です。インデックス ファイルの拡張子は .MYI (MYIndex) です。 | ディスクベースのリソースは、InnoDB テーブルスペース データ ファイルとそのログ ファイルです。InnoDB テーブルのサイズは、オペレーティング システム ファイルのサイズによってのみ制限されます (通常は 2GB)。 |
トランザクション処理の側面: | MyISAM タイプのテーブルはパフォーマンスを重視しており、その実行は InnoDB タイプよりも高速ですが、トランザクションのサポートは提供しません。 | InnoDB は、トランザクション サポート トランザクション、外部キー (外部キー) およびその他の高度なデータベース機能を提供します。 |
SELECT UPDATE,INSERT,Delete 操作する |
頻繁に SELECT を実行する場合は、MyISAM の方が良い選択です。 | 1. データで大量の INSERT または UPDATE を実行する場合は、パフォーマンス上の理由から、InnoDB テーブルを使用する必要があります。 2. DELETE FROM テーブルの場合、InnoDB はテーブルを再作成せず、行ごとに削除します。 3. LOAD TABLE FROM MASTER 操作は InnoDB では機能しません。解決策は、最初に InnoDB テーブルを MyISAM テーブルに変更し、データをインポートした後にそれを InnoDB テーブルに変更することですが、追加の InnoDB 機能 (外部キーなど) を備えたテーブルには適用されません。 |
****AUTO_INCREMENT に対するアクション | テーブルごとに 1 つの AUTO_INCREMEN カラムの内部処理。MyISAM は、INSERT および UPDATE 操作のためにこの列**を自動的に更新します。これにより、AUTO_INCREMENT カラムが高速化されます (少なくとも 10%)。シーケンスの先頭の値が削除されると、再利用できなくなります。(複数列インデックスの最後の列として AUTO_INCREMENT カラムが定義されている場合、シーケンスの先頭から削除された値が再利用される場合があります)。AUTO_INCREMENT 値は、ALTER TABLE または myisamch でリセットできます。AUTO_INCREMENT タイプのフィールドの場合、InnoDB にはこのフィールドのインデックスのみが含まれている必要がありますが、MyISAM テーブルでは、他のフィールドとの結合インデックスを作成できます。より高速な auto_increment 処理 | テーブルに AUTO_INCREMENT カラムを指定すると、データ ディクショナリの InnoDB テーブル ハンドルには自動インクリメント カウンタと呼ばれるカウンタが含まれます。このカウンタは、カラムに新しい値を割り当てるために使用されます。自動インクリメント カウンタはメイン メモリにのみ保存され、ディスクには保存されません。このカウンタのアルゴリズム実装については、「InnoDB での AUTO_INCREMENT カラムの仕組み」を参照してください。 |
テーブル内の特定の行数 | select count() from table, MyISAM は単に保存された行の数を読み出すだけです. count() ステートメントに where 条件が含まれている場合、2 つのテーブルの操作は同じであることに注意してください | InnoDB はテーブル内の特定の行数を保存しません。つまり、テーブルから select count(*) を実行するとき、InnoDB はテーブル全体をスキャンして、存在する行数を計算する必要があります。 |
ロック | テーブルロック | 行ロック (行レベルでのロック) を提供し、Oracle タイプと一致する SELECT での非ロック読み取りを提供します。また、InnoDB テーブルの行ロックは絶対的ではありません。MySQL が SQL ステートメントの実行時にスキャンする範囲を決定できない場合、InnoDB テーブルはテーブル全体もロックします。たとえば、更新テーブル セット num=1 の場合、「%aaa%」のような名前が付けられます。 |
ストレージ エンジンを選択する際は、アプリケーション システムの特性に応じて適切なストレージ エンジンを選択する必要があります。複雑なアプリケーション システムの場合は、実際の状況に応じて複数のストレージ エンジンを選択して組み合わせることもできます。以下は、一般的に使用されるいくつかのストレージ エンジンの使用環境です。
- InnoDB: Mysql のデフォルトのストレージ エンジンであり、トランザクション処理アプリケーションに使用され、外部キーをサポートします。アプリケーションのトランザクションの整合性に対する要件が比較的高く、同時実行条件下でのデータの一貫性が必要であり、データ操作に挿入やクエリに加えて多くの更新操作や削除操作が含まれる場合は、InnoDB ストレージ エンジンがより適切な選択肢になります。InnoDB ストレージ エンジンは、削除と更新によって引き起こされるロックを効果的に削減するだけでなく、トランザクションの完全な送信とロールバックを保証します。請求システムや金融システムなど、高いデータ精度要件があるシステムには、InnoDB が最適な選択肢です。
- MyISAM: アプリケーションが主に読み取りと挿入の操作に基づいており、更新と削除の操作はわずかで、トランザクションの整合性と同時実行性の要件がそれほど高くない場合、このストレージ エンジンは選択に非常に適しています。
- メモリ: すべてのデータを RAM に保存し、レコードやその他の同様のデータを迅速に見つける必要がある場合に、いくつかのブロックへのアクセスを提供します。MEMORY の欠点は、テーブルのサイズに制限があることです。大きすぎるテーブルはメモリにキャッシュできません。2 つ目は、テーブル内のデータを確実に復元できることです。データベースが異常終了した後でも、テーブル内のデータは復元できます。MEMORY テーブルは通常、アクセス結果を迅速に取得するために頻繁に更新されない小さなテーブルに使用されます。
- MERGE: 一連の同等の MyISAM テーブルを論理的に結合し、それらをオブジェクトとして参照するために使用されます。MERGE テーブルの利点は、単一の MyISAM テーブルのサイズ制限を突破できることです。また、異なるテーブルを複数のディスクに分散することで、MERGE テーブルのアクセス効率を効果的に向上させることができます。これは、データ ウェアハウスなどの VLDB 環境の保存に最適です。
要約する
面接の質問では、通常、使用されている InnoDB と MyISAM の違いについてのみ答えるように求められます。しかし、その違いがある理由をさらに深く掘り下げる必要がある場合は、基礎となる実装原理を理解する必要があります。ちなみに、B+ ツリーについてもある程度の理解が必要です。この記事を読んだ読者はすでにその背後にある原理をより明確に理解でき、望ましいオファーを獲得することに一歩近づくことができると思います。