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

推薦する

HTMLのリストタグを数える

1. <dl>はリストを定義し、<dt>はリスト内の項目を定義し、<d...

CSS画像結合技術(スプライト画像)の詳しい説明

CSS画像結合技術1. 画像のステッチ画像ステッチング技術は、個々の画像を収集する技術です。画像の多...

HTML で複数のフォームのテキスト ボックスを揃える方法

フォームのコードは図の通りです。スタイルシートがまだ追加されていないため、フォームが整列されておらず...

Vueのprops設定の詳細な説明

<テンプレート> <div class="demo">...

Dockerコンテナの接続と通信の実装

ポート マッピングは、Docker を別のコンテナーに接続する唯一の方法ではありません。 Docke...

VMware15.5 インストール Ubuntu20.04 グラフィック チュートリアル

1. インストール前の準備1. 公式ウェブサイトからUbuntu 20.04のイメージファイルを直接...

MySQL ジョイントインデックスの使用ルール

結合指数は複合指数とも呼ばれます。複合インデックスの場合: MySQL はインデックス内のフィールド...

Ubuntu 18.04 サーバーのパスワードを忘れたり改ざんされた場合にパスワードをリセットする方法

最近、サーバー上のアカウントが2つハッキングされ、パスワードが改ざんされました。幸い、まだ使えるアカ...

テーブルの4辺を上下左右にスクロールするように固定する方法

質問:最近、プロジェクトの統計を行っていたときに、テーブルを上下にスクロールしたときにテーブルの先頭...

Linux システムで jmeter を実行し、ローカル メモリを最適化する方法の詳細な説明

1. Linuxシステムにクロスシステムファイル転送ツールをインストールするルートユーザーのルートデ...

Angularフレームワークのビュー抽象定義の詳細な説明

序文「大規模なフロントエンド プロジェクト向け」に設計されたフロントエンド フレームワークである A...

mysql スケジュールタスク (イベント イベント) の詳細な説明

1. イベントの簡単な紹介イベントは、MySQL が特定の時間に呼び出す手続き型データベース オブジ...

vue+node+socket ioは複数人のインタラクションを実現し、プロセス全体を解放します

1. 背景1. フロントエンドはvue + vuex + socket.io-clientを使用しま...

Vueコンポーネントの7つの通信方法についての深い理解

目次1. props/$emit導入コードサンプル2.Vスロット導入コードサンプル3.$refs/ ...

Centos8 で yum を使用して rabbitmq をインストールするチュートリアル

/etc/yum.repos.d/フォルダに入るrabbitmq-erlang.repo ファイルを...