ホームページ >データベース >mysql チュートリアル >mysqlのMyISAMとInnoDBの違いは何ですか
相違点: 1. InnoDB はトランザクションをサポートしますが、MyISAM はサポートしません; 2. InnoDB は外部キーをサポートしますが、MyISAM はサポートしません; 3. InnoDB はクラスター化インデックスですが、MyISAM は非クラスター化インデックスですインデックス; 4. Innodb はフルテキスト インデックスをサポートしませんが、MyISAM はフルテキスト インデックスをサポートします; 5. InnoDB はテーブルおよび行レベルのロックをサポートしますが、MyISAM はテーブル レベルのロックをサポートします; 6. InnoDB テーブルには一意のインデックスが必要ですが、 Myisam には必要ありません; 7. 保存ファイルが異なります。
このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。
InnoDB: MySQL のデフォルトのトランザクション エンジンは、最も重要で広く使用されているストレージ エンジンでもあります。多数の短期トランザクションを扱うように設計されており、ほとんどの場合、短期トランザクションは正常に送信され、ロールバックされることはほとんどありません。 InnoDB のパフォーマンスと自動クラッシュ回復機能により、非トランザクション ストレージのニーズに人気があります。別のストレージ エンジンを使用する特別な理由がない限り、InnoDB エンジンを優先する必要があります。
MyISAM: MySQL 5.1 以前のバージョンでは、MyISAM がデフォルトのエンジンです。 MyISAM は、フルテキスト インデックス作成、圧縮、空間関数 (GIS) などを含む多数の機能を提供しますが、MyISAM はトランザクションと行レベルのロックをサポートしておらず、疑いのない欠陥は、トランザクション後に安全に回復できないことです。クラッシュ。
1. InnoDB はトランザクションをサポートしますが、MyISAM はサポートしません。 InnoDB のステートメント デフォルトでは、言語はトランザクションにカプセル化され、自動的に送信されますが、速度に影響するため、トランザクションを形成するには、begin と commit の間に複数の SQL 言語を入れるのが最善です。 ##2. InnoDB は外部キーをサポートしますが、MyISAM はサポートしません。外部キーを含む InnoDB テーブルを MYISAM に変換すると失敗します;
3. InnoDB はインデックス構造として B ツリーを使用するクラスター化インデックスであり、データ ファイルは (プライマリ(テーブル データ ファイル自体は B ツリーによって編成されたインデックス構造です)、両方とも主キーが必要であり、主キーを使用したインデックス作成は非常に効率的です。ただし、補助インデックスには 2 つのクエリが必要です。最初に主キーをクエリし、次に主キーを介してデータをクエリします。したがって、主キーが大きすぎると、他のインデックスも大きくなるため、主キーは大きすぎないでください。
MyISAM は非クラスター化インデックスであり、インデックス構造として B ツリーも使用します。インデックスとデータ ファイルは分離されており、インデックスにはデータ ファイルのポインタが保存されます。 。主キーインデックスと副キーインデックスは独立しています。
つまり、InnoDB の B ツリー主キー インデックスのリーフ ノードはデータ ファイルであり、補助インデックスのリーフ ノードは主キーの値ですが、MyISAM のリーフ ノードはデータ ファイルです。 B ツリー主キー インデックスと補助インデックスは両方ともデータ ファイルのアドレス ポインタです。
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 サイトの他の関連記事を参照してください。