MySQL MyISAM と InnoDB の違い

MySQL MyISAM と InnoDB の違い

違い:

1. InnoDB はトランザクションをサポートしていますが、MyISAM はサポートしていません。InnoDB の場合、各 SQL ステートメントはデフォルトでトランザクションとしてカプセル化され、自動的にコミットされるため、速度に影響します。したがって、トランザクションを形成するには、begin と commit の間に複数の SQL ステートメントを配置するのが最適です。

2. InnoDB は外部キーをサポートしますが、MyISAM はサポートしません。外部キーを含む InnoDB テーブルを MYISAM に変換すると失敗します。

3. InnoDB はクラスター化インデックスであり、インデックス構造として B+Tree を使用します。データ ファイルは (主キー) インデックスにバインドされます (テーブル データ ファイル自体は B+Tree で編成されたインデックス構造です)。主キーが存在する必要があり、主キー インデックスの効率は非常に高くなります。ただし、補助インデックスには 2 つのクエリが必要です。最初に主キーをクエリし、次に主キーを通じてデータをクエリします。したがって、主キーが大きすぎると他のインデックスも大きくなるため、主キーは大きすぎてはなりません。

MyISAM は非クラスター化インデックスであり、インデックス構造として B+Tree も使用します。インデックスとデータ ファイルは別々であり、インデックスはデータ ファイルへのポインタを保存します。主キー インデックスとセカンダリ インデックスは独立しています。

つまり、InnoDB の B+ ツリー主キー インデックスのリーフ ノードはデータ ファイルであり、補助インデックスのリーフ ノードは主キーの値です。一方、MyISAM の B+ ツリー主キー インデックスと補助インデックスのリーフ ノードは、どちらもデータ ファイルへのアドレス ポインターです。

4. InnoDB はテーブル内の特定の行数を保存しません。select count(*) from table を実行する場合、テーブル全体をスキャンする必要があります。 MyISAM は、テーブル全体の行数を保存するために変数を使用します。上記のステートメントを実行するときは、変数を読み取るだけでよく、非常に高速です (WHERE 条件を追加できないことに注意してください)。

では、なぜ InnoDB にはこの変数がないのでしょうか?

InnoDB のトランザクションの性質上、テーブル内の同時行数はトランザクションごとに異なります。したがって、カウント統計は、クイック クエリの合計行数を保存するのではなく、現在のトランザクションでカウントできる行数を計算します。 InnoDB は、オプティマイザが別のインデックスを使用するように指示しない限り、可能な限り小さいインデックスをトラバースしようとします。セカンダリ インデックスが存在しない場合、InnoDB は他のクラスター化インデックスのトラバースも試行します。
インデックスが InnoDB によって管理されるバッファ プール内に完全に含まれていない場合、カウント操作には時間がかかります。行の合計数を記録するテーブルを作成し、INSERT/DELETE 中にプログラムで対応するデータを更新することができます。上記の問題と同様に、この時点で複数のトランザクションがある場合、このソリューションはうまく機能しません。おおよその行の値がニーズを満たすのに十分である場合は、SHOW TABLE STATUSを試すことができます。

5. InnoDB はフルテキスト インデックスをサポートしていませんが、MyISAM はサポートしています。フルテキスト インデックスの分野では、MyISAM の方がクエリ効率が高速です。PS: InnoDB 5.7 以降はフルテキスト インデックスをサポートしています。

6. MyISAMテーブルは圧縮してクエリできる

7. InnoDBはテーブルレベルと行レベル(デフォルト)のロックをサポートし、MyISAMはテーブルレベルのロックをサポートします。

InnoDB の行ロックは、物理的な行レコードではなくインデックスに実装されます。つまり、アクセスがインデックスにヒットしない場合、行ロックは使用できず、テーブル ロックに退化します。

8. InnoDB テーブルには主キーが必要です (ユーザーが指定しない場合は、テーブルが自動的に主キーを見つけるか生成します)。一方、MyISAM には主キーがありません。

9. Innodb ストレージファイルは frm と ibd ですが、Myisam は frm、MYD、MYI です。

Innodb: frm はテーブル定義ファイル、ibd はデータファイルです

Myisam: frm はテーブル定義ファイル、myd はデータファイル、myi はインデックスファイルです

選び方:

1. トランザクションをサポートするかどうか。サポートする場合は、InnoDB を選択してください。サポートしない場合は、MyISAM を検討してください。

2. テーブル内のクエリのほとんどが読み取りクエリである場合は、MyISAM を検討できます。読み取りクエリと書き込みクエリの両方がある場合は、InnoDB を使用してください。

3. システムがクラッシュした後、MyISAM の回復はより困難になります。これは許容できますか?

4. MySQL 5.5 バージョンから、Innodb が MySQL のデフォルト エンジンになりました (以前は MyISAM でした)。これは、その利点が誰の目にも明らかであることを示しています。何を使うべきかわからない場合は、InnoDB を使用してください。少なくとも悪くはありません。

InnoDB が自動インクリメント ID を主キーとして使用することを推奨するのはなぜですか?

回答: 自動インクリメント ID により、挿入が発生するたびに B+ インデックスが右から拡張されるため、B+ ツリーの頻繁なマージと分割が回避されます (UUID を使用する場合と比較して)。文字列の主キーとランダムな主キーを使用すると、データがランダムに挿入されるため、非効率的です。

InnoDBエンジンの4つの主要機能

挿入バッファ、二重書き込み、適応ハッシュインデックス(AHI)、先読み

上記はMySQL MyISAMとInnoDBの違いについての詳しい内容です。MySQL MyISAMとInnoDBについてさらに詳しく知りたい方は、123WORDPRESS.COMの他の関連記事もぜひご覧ください!

以下もご興味があるかもしれません:
  • InnoDBのインデックスページ構造、挿入バッファ、適応ハッシュインデックスについての簡単な説明
  • MySQL InnoDB ロックの概要
  • MySQL の innodb_flush_log_at_trx_commit と sync_binlog を区別する方法
  • MySQL InnoDB ロック メカニズムの詳細な例
  • MySQLテクノロジーにおけるInnoDBロックの詳細な説明
  • MySQLデータベースエンジンをInnoDBに変更する
  • MySQL InnoDB の重要なコンポーネントの概要
  • Mysql InnoDBとMyISAMの違いの分析
  • MySQL innodb B+ツリーの高さを取得する方法
  • MySQLでデータテーブルを作成するときにエンジンMyISAM/InnoDBを設定する
  • MySQL Innodbの主な機能挿入バッファ

<<:  Nginx で 403 forbidden を解決するための完全な手順

>>:  Vueは、商品の数を制御するためのコンポーネントのパッケージ化と使用を実装します。

推薦する

ラジオボタンとチェックボックス効果の純粋な CSS 実装例

ラジオボタンとチェックボックスラジオボタンとチェックボックスの効果を実現するための純粋な CSSラジ...

crontab スケジュールされたタスクが実行されない理由の分析と解決

序文Linux のスケジュールされたタスクを実装する方法としては、cron、anacron、at な...

Centos7 への MySQL8 のインストールチュートリアル

MySQL 8 の新機能: MySQL をバージョン 5.x から 8.x に直接アップグレードする...

Mysql5.6.36 スクリプトのコンパイル、インストール、初期化のチュートリアル

概要この記事は、centos7.3 上で mysql5.3.6 を自動的にコンパイルしてインストール...

インデックスは MySQL クエリ条件で使用されますか?

雇用主から MySQL クエリ条件でインデックスが使用されるかどうかを尋ねられた場合、どのように答え...

Nginx の負荷分散アルゴリズムとフェイルオーバー分析

概要Nginx ロード バランシングは、アップストリーム サーバー (実際のビジネス ロジックによっ...

uniapp パッケージ化されたアプレット レーダー チャート コンポーネントの完全なコード

効果画像:実装コードは以下のとおりですビュー <canvas id="radar-c...

Windows 10 での MySQL 8.0 のダウンロードとインストール構成のグラフィック チュートリアル

この記事では、MySQL 8.0のダウンロードとインストールについてご紹介します。具体的な内容は以下...

Nginxのアクセスボリューム制御の詳細な説明

目的リクエスト アクセス ボリュームを制御するための Nginx ngx_http_limit_co...

Element-ui NavMenuサブメニューを使用して再帰的に生成する場合のエラーの詳細な説明

ナビゲーションバーのサブメニューを再帰的に生成すると、メニューは正常に生成できるが、マウスをホバーす...

MySQL インデックスの長さ制限の原理の分析

この記事は主に、MySQL インデックスの長さ制限の原理の分析を紹介します。サンプル コードを通じて...

Linuxは数字当てゲームのソースコードを実装する

シンプルな Linux 推測ゲームのソースコードゲームのルール:数字当てゲームは通常 2 人でプレイ...

Linux のスケジュールされたタスクの crontab のインストールと使用の詳細な説明

crontabをインストールするyum install crontabs CentOS 7が付属して...

JavaScript は自由に移動するウィンドウのマウス制御を実装します

この記事では、フリーウィンドウのマウス制御を実現するためのJavaScriptの具体的なコードを参考...

SQL文のパフォーマンスを分析するための標準的な要約

この記事では、explain を使用して SQL ステートメントを分析する方法を紹介します。実際、イ...