web-dev-qa-db-ja.com

MySQLのInnoDBとMyISAMとは何ですか?

InnoDBMyISAMおよびMySQLとは何ですか?

109
user130561

InnoDBおよびMYISAMは、MySQLのストレージエンジンです。

これら2つのロックの実装は異なります。InnoDBはテーブル内の特定の行をロックし、MyISAMMySQLテーブル全体をロックします。

DBでテーブルを作成するときにMYISAM OR InnoDB]を指定することにより、タイプを指定できます。

94
Siva

見て

InnoDB および MyISAM

InnoDBはMySQLのストレージエンジンであり、MySQL ABが配布する現在のすべてのバイナリに標準として含まれています。 MySQLで使用できる他のストレージエンジンに対する主な機能強化は、ACID準拠のトランザクションサポートです。

MyISAMは、5.5 1 より前のバージョンのMySQLリレーショナルデータベース管理システムのデフォルトのストレージエンジンです。これは古いISAMコードに基づいていますが、多くの便利な拡張機能があります。MyISAMの主な欠点は、トランザクションのサポートがないことです。MySQL 5.5以降のバージョンはInnoDBエンジンに切り替えて、参照整合性制約とより高い同時実行性を確保しています。

37
Adriaan Stander

それらはストレージエンジンです。

http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html

MyISAM:デフォルトのMySQLストレージエンジンであり、Web、データウェアハウジング、およびその他のアプリケーション環境で最も使用されるもの。 MyISAMはすべてのMySQL構成でサポートされており、デフォルトで別のMySQLを使用するようにMySQLを構成していない限り、デフォルトのストレージエンジンです。

InnoDB:ユーザーデータを保護するためのコミット、ロールバック、クラッシュリカバリ機能を備えた、MySQL用のトランザクションセーフ(ACID準拠)ストレージエンジン。 InnoDBの行レベルのロック(より粗い粒度のロックへのエスカレーションなし)およびOracleスタイルの一貫した非ロック読み取りにより、マルチユーザーの同時実行性とパフォーマンスが向上します。 InnoDBはユーザーデータをクラスター化インデックスに保存して、主キーに基づく一般的なクエリのI/Oを削減します。データの整合性を維持するために、InnoDBはFOREIGN KEY参照整合性制約もサポートしています。

17
mluebke

テーブルごとに特定のストレージエンジンを指定できることは、MySQLの重要な長所の1つです(使いやすく、微調整なしで優れたパフォーマンスを実現できること)。トランザクションが必要なすべての操作については、InnoDBに固執するだけです。ただし、MyISAMは、特定の状況でトランザクションが不要な場合に本当に速度を上げることができます。InnoDBと比較して、必要なディスクスペースが少なく、RAMです。

とはいえ、InnoDBは常に改善されています。

InnoDB 1.1のパフォーマンスとスケーラビリティの強化

5
Damir Bulic

MyISAMは、データの整合性を維持するためにトランザクションを追跡するInnoDBとは異なり、ACIDを追跡しません。

MyISAMは同時挿入をサポートします。データファイルの途中にテーブルに空きブロックがない場合、他のスレッドがテーブルから読み取ると同時に新しい行を挿入できます。 MySqlDoc

そのため、MyISAMはより高速で、必要なスペースが少なくなります。たとえば、MySQL MyISAM Storage Engineはトランザクションをサポートしていません。 MySQL MYISAMの制約 というビットがあります concurrent-insert デフォルトでは、変数は1に設定され、concurrent挿入は上記のように処理されます。 0に設定されている場合、同時挿入は無効になります。 2に設定されている場合、行が削除されたテーブルに対しても、テーブルの末尾での同時挿入が許可されます。テーブルの中央に(同時挿入の時点で)ホール/削除された行がない場合は、INSERTステートメントを実行して、selectでテーブルの最後に行を同時に追加できます。

Mysql InnoDBのデフォルトの分離レベルは「Read Repeatable」です。 MyISAMの場合、トランザクションはありません。 InnoDBは行レベルのロックを使用しますが、MyISAMはテーブルレベルのロックのみを使用できるため、InnoDBにはクラッシュの取り消しがMyISAMよりも優れています。並行性の影響を避けたい場合は、MyISAMでテーブルレベルロックを手動で取得する必要があります

4
hi.nitish

MySQLサーバーがクラッシュすると、その大きなInnoDBトランザクションファイルからよりもMyISAMテーブルのセットからデータをはるかに簡単に回復できます。各MyISAMテーブルには個別のファイルがあり、クラッシュ中にこのテーブルに対して書き込み操作が行われなかった場合、まったく影響を受けません。 InnoDBの場合、MySQLサーバー全体のトランザクションファイル全体のインデックスを再作成するか、クラッシュ後のインデックスを作成する必要があります。それはかなり面倒になります。

1
Alex Gnatko

InnoDBはデフォルトのNOT myISAMです https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html "InnoDBはデフォルトのMySQLストレージエンジンです。異なるデフォルトのストレージエンジン、ENGINE =句なしでCREATE TABLEステートメントを発行すると、InnoDBテーブルが作成されます」

1
adwairi

InnoDBはMySQLのトランザクションストレージエンジンですが、MyISAMは非トランザクションストレージエンジンです。つまり、InnoDBはACIDプロパティに従ってデータの整合性を維持しますが、MyISAMはACIDプロパティに従っていないため、データの整合性を維持できません。

InnoDB(トランザクション)テーブルでは、ロールバックが必要な場合、トランザクションの変更を簡単に元に戻すことができます。ただし、トランザクションのロールバックが必要な場合、MyISAM(非トランザクション)テーブルに加えられた変更を元に戻すことはできません。

たとえば、当座預金口座から普通預金口座にお金を振り替えたいとします。これは、5つのクエリを含むトランザクションによって実行されます。

1 START TRANSACTION;
2 SELECT balance FROM checking WHERE customer_id = 10233276;
3 UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4 UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
5 COMMIT;

ステップ4でプロセスがクラッシュするとします。ここでInnoDBテーブルが使用された場合、ロールバックにより変更が取り消され、お金を失うリスクを回避できます。文字通り、ステップ5が正常に実行されない限り、変更はテーブルにコミットされないため、テーブルはクラッシュを認識しません。

しかし、MyISAMテーブルの場合、ロールバックが呼び出されたとき、またはトランザクションの失敗につながるクラッシュがある場合、トランザクションの変更を元に戻すことはできません。つまり、ステップ3でトランザクションがクラッシュした場合、当座預金口座からお金が差し引かれます。しかし、お金は普通預金口座に追加されませんでした。

礼儀の例:「高性能MySQL:最適化、バックアップ、レプリケーション」-Arjen Lentz、Derek J. Balling、Jeremy Zawodny、Peter Zaitsev著、ワディム・トカチェンコ

0