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は、商品の数を制御するためのコンポーネントのパッケージ化と使用を実装します。

推薦する

UniappはBaidu Voiceを使用して録音をテキストに変換する機能を実現

3日間さまざまな困難に遭遇した後、ようやくこの機能を実現しました。正常に実装できる方法を見つける前に...

axios を使用してプロジェクト内の複数の繰り返しリクエストをフィルタリングする方法

目次1. はじめに:この場合、通常は 2 つのアプローチがあります。 2. CancelToken ...

Vueルーティングコンポーネントでパラメータを渡す8つの方法の詳細な説明

シングルページアプリケーションを開発する場合、特定のルートを入力し、パラメータに基づいてサーバーから...

MySQLサービスが起動しても接続されない問題の解決策

mysql サービスは開始されていますが、接続できません。この問題を解決するにはどうすればよいでしょ...

Node はあいまい検索用の検索ボックスを実装します

この記事の例では、検索ボックスでファジークエリを実装するためのNodeの具体的なコードを参考までに共...

フォームアクションとonSubmitの例

まず、action はフォームの属性です。HTML5 では必須の属性値として定義されています。onS...

MySQLパスワードを忘れた場合のいくつかの解決策

解決策1完全にアンインストールしてすべてのデータを削除します。まず、MySQLに関連するすべてのプロ...

Centos6.5 で MySQL 5.7.19 をインストールして設定する方法

Centos6.5にmysql5.7.19をインストールするための詳細な手順は次のとおりです。 1....

Ubuntu での Subversion (SVN) の詳細なインストールと設定

ソフトウェア開発者であれば、Subversion に精通している必要があります。 Subversio...

少なくとも7日間連続して注文を行ったユーザーに対するSQLクエリ

テーブルを作成するテーブル order(id varchar(10),date datetime,o...

APP (IOS、Android) を呼び出すモバイル H5 の記述例

iOS 1. URLスキームこのソリューションは基本的に、WeChat、QQ 組み込みブラウザ、QQ...

MySQL 8.0.19 winx64 インストールチュートリアルと Windows 10 での初期パスワードの変更

この記事では、参考までにMySQL 8.0.19 winx64のインストールチュートリアルを紹介しま...

Mysql 中国語ソートルールの説明

MySQL を使用する際、フィールドをソートしたりクエリしたりすることがよくあります。通常は、中国語...

サラウンドリフレクションロード効果を実現するHTML+CSS

この記事では、主に html + css を使用してサラウンド リフレクション ローディング エフェ...

IE6/7 は混乱するだろう: 空のテキスト ノードの高さの問題

序文: ietester でドキュメント コードを表示するには、debugbar を使用します。すべ...