ホームページ  >  記事  >  データベース  >  mysqlのMyISAMとInnoDBの違いは何ですか

mysqlのMyISAMとInnoDBの違いは何ですか

青灯夜游
青灯夜游オリジナル
2022-11-08 19:42:5933899ブラウズ

相違点: 1. InnoDB はトランザクションをサポートしますが、MyISAM はサポートしません; 2. InnoDB は外部キーをサポートしますが、MyISAM はサポートしません; 3. InnoDB はクラスター化インデックスですが、MyISAM は非クラスター化インデックスですインデックス; 4. Innodb はフルテキスト インデックスをサポートしませんが、MyISAM はフルテキスト インデックスをサポートします; 5. InnoDB はテーブルおよび行レベルのロックをサポートしますが、MyISAM はテーブル レベルのロックをサポートします; 6. InnoDB テーブルには一意のインデックスが必要ですが、 Myisam には必要ありません; 7. 保存ファイルが異なります。

mysqlのMyISAMとInnoDBの違いは何ですか

このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。

InnoDB: MySQL のデフォルトのトランザクション エンジンは、最も重要で広く使用されているストレージ エンジンでもあります。多数の短期トランザクションを扱うように設計されており、ほとんどの場合、短期トランザクションは正常に送信され、ロールバックされることはほとんどありません。 InnoDB のパフォーマンスと自動クラッシュ回復機能により、非トランザクション ストレージのニーズに人気があります。別のストレージ エンジンを使用する特別な理由がない限り、InnoDB エンジンを優先する必要があります。

MyISAM: MySQL 5.1 以前のバージョンでは、MyISAM がデフォルトのエンジンです。 MyISAM は、フルテキスト インデックス作成、圧縮、空間関数 (GIS) などを含む多数の機能を提供しますが、MyISAM はトランザクションと行レベルのロックをサポートしておらず、疑いのない欠陥は、トランザクション後に安全に回復できないことです。クラッシュ。

MySQL における MyISAM と InnoDB の違い:

1. InnoDB はトランザクションをサポートしますが、MyISAM はサポートしません。 InnoDB のステートメント デフォルトでは、言語はトランザクションにカプセル化され、自動的に送信されますが、速度に影響するため、トランザクションを形成するには、begin と commit の間に複数の SQL 言語を入れるのが最善です。 ##2. InnoDB は外部キーをサポートしますが、MyISAM はサポートしません。外部キーを含む InnoDB テーブルを MYISAM に変換すると失敗します;

3. InnoDB はインデックス構造として B ツリーを使用するクラスター化インデックスであり、データ ファイルは (プライマリ(テーブル データ ファイル自体は B ツリーによって編成されたインデックス構造です)、両方とも主キーが必要であり、主キーを使用したインデックス作成は非常に効率的です。ただし、補助インデックスには 2 つのクエリが必要です。最初に主キーをクエリし、次に主キーを介してデータをクエリします。したがって、主キーが大きすぎると、他のインデックスも大きくなるため、主キーは大きすぎないでください。

MyISAM は非クラスター化インデックスであり、インデックス構造として B ツリーも使用します。インデックスとデータ ファイルは分離されており、インデックスにはデータ ファイルのポインタが保存されます。 。主キーインデックスと副キーインデックスは独立しています。

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

mysqlのMyISAMとInnoDBの違いは何ですか

mysqlのMyISAMとInnoDBの違いは何ですか4. InnoDB はテーブル内の特定の行数を保存せず、実行時にテーブル全体が必要です。テーブルスキャンからカウント(*)を選択します。 MyISAM は変数を使用してテーブル全体の行数を保存します。上記のステートメントを実行するときは、変数を読み取るだけで済み、非常に高速です (WHERE 条件を追加できないことに注意してください);

それではなぜですか? InnoDB にこの変数がない場合はどうなるでしょうか?

InnoDB のトランザクション特性により、同じタイム テーブル内の行数はトランザクションごとに異なります。そのため、カウント統計では、Store ではなく、現在のトランザクションでカウントできる行数が計算されます。クイッククエリの合計行数。 InnoDB は、オプティマイザが別のインデックスの使用を要求しない限り、可能な限り最小のインデックスを走査しようとします。セカンダリ インデックスが存在しない場合、InnoDB は他のクラスター化インデックスも走査しようとします。

InnoDB によって維持されるバッファ (バッファ プール) にインデックスが完全に存在しない場合、カウント操作にはさらに時間がかかります。合計行数を記録するテーブルを作成し、INSERT/DELETE 中にプログラムで対応するデータを更新させることができます。上で述べた問題と同様、現時点で複数のトランザクションがある場合、この解決策はあまり役に立ちません。おおよその行値でニーズを満たすのに十分な場合は、SHOW TABLE STATUS



5 を試してください。Innodb はフルテキスト インデックス作成をサポートしていませんが、MyISAM はフルテキスト インデックス作成をサポートしています。フルテキスト インデックス作成の分野におけるクエリ効率の観点から、MyISAM はますます高速になっています。追記: InnoDB 5.7 以降ではフルテキスト インデックス作成がサポートされています

6. MyISAM テーブルはクエリ操作のために圧縮できます。

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

InnoDB の行ロックは、物理的な行レコードをロックするのではなく、インデックスに実装されます。サブテキストは、アクセスがインデックスにヒットせず、行ロックが使用できない場合、テーブル ロックに縮退するということです。

例:

t_user(uid, uname, age, sex) innodb;
 
    uid PK
    无其他索引
    update t_user set age=10 where uid=1;             命中索引,行锁。
 
    update t_user set age=10 where uid != 1;           未命中索引,表锁。
 
    update t_user set age=10 where name='chackca';    无索引,表锁。

8. InnoDB テーブルには一意のインデックス (主キーなど) が必要です (ユーザーが指定しない場合、ユーザーは/デフォルトの主キーとして機能する非表示の列 Row_id を生成します). そして Myisam はそれを持つことができません

9. Innodb ストレージ ファイルには frm と ibd が含まれますが、Myisam は frm、MYD、 MYI

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

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

##選択方法:

1. トランザクションをサポートしますか?そうであれば、innodb を選択してください。そうでない場合は、MyISAM を検討してください。

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

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

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

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

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

#innodb エンジンの 4 つの主な機能## バッファーの挿入、二重書き込み、適応型ハッシュ インデックス (ahi)、読み取り先へ (先を読む)

[関連する推奨事項: mysql ビデオ チュートリアル

]

以上がmysqlのMyISAMとInnoDBの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。