web-dev-qa-db-ja.com

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

現在のWebプロジェクトのデータベースとしてMySQLを使用しています。 MySQLは初めてです。 InnoDBとMyISAMの違いを教えてください。

17
user16614

ISAM = Indexed Sequential Access Methodであり、本質的にフラットファイルです(BtrieveまたはB-Treeを思い出し、考えることができるDBA向け)。それは非常に古いテクノロジーですが、それを使用するのをやめさせないでください。これはフラットファイルであるため(詳細は後で説明します)、リレーショナルではないため、RDBMSではなく、状況によってはより適切です。

InnoDBは、皆さんがよく知っているような完全なRDBMSです。 MyISAMは、リンク、ロジック、および参照整合性を維持する上に追加された別のレイヤーを介してリレーショナルであるように見えます。

ISAMは、大量のレコード(2,000万など)があり、ほとんどの場合スタンドアロンです(つまり、関連するデータを取得するために多数のリンクを実行する必要がない場合)。インデックスに非常に依存しているため、適切なインデックスがない場合は、非常に長いクエリ時間に備えてください。要点:Btrieve ISAM 20M +レコードのテーブルがあり、正確なインデックスに基づいてデータの取得とフィルタリングを行うのはほとんど瞬時でした。文字列を間違えると、文字通り15分かかりました。

InnoDBは、多くのリレーショナルリンクがある場合に最適です。テーブルAは、テーブルCとDを参照するテーブルBのフィールドを参照します。InnoDBは、あらゆる種類のニース結合メソッド(ハッシュ結合など)を使用してこれらのレコードをフェッチできますが、ISAMデータベースはすべての単一行に対して複数のサブクエリを実行し、レコードを手動で照合します。

それ以上の詳細が必要な場合は、データベースのコースを実際に行う必要があります。

14
Mark Henderson

最も基本的なのは、InnoDBがトランザクション対応であることです。 MyIsamはそうではありません。 MyIsamは一般的に少し高速なので、トランザクションが必要ない場合は、一般的に最善の方法です。詳細については、MySQLのドキュメントをご覧ください。

5
John Gardeniers

ゲームには少し遅れますが、非常に包括的です 数か月前に書いた投稿 で、MYISAMとInnoDBの主な違いを詳しく説明しています。クッパ(そしておそらくビスケット)をつかんで、楽しんでください。


MyISAMとInnoDBの主な違いは、参照整合性とトランザクションにあります。ロック、ロールバック、全文検索など、その他の違いもあります。

参照整合性

参照整合性により、テーブル間の関係の一貫性が維持されます。より具体的には、これは、テーブル(例:リスト)が別のテーブル(例:製品)を指す外部キー(例:製品ID)を持っている場合、更新先または削除先が指定されたテーブルで発生すると、これらの変更はリンクにカスケードされますテーブル。この例では、製品の名前が変更されると、リンクテーブルの外部キーも更新されます。 「商品」テーブルから商品が削除されると、削除されたエントリをポイントしているリストもすべて削除されます。さらに、新しいリストには、有効な既存のエントリを指す外部キーが必要です。

InnoDBはリレーショナルDBMS(RDBMS)であるため、参照整合性がありますが、MyISAMにはありません。

トランザクションと原子性

テーブル内のデータは、SELECT、INSERT、UPDATE、DELETEなどのデータ操作言語(DML)ステートメントを使用して管理されます。トランザクションは、2つ以上のDMLステートメントを1つの作業単位にグループ化するため、単位全体が適用されるか、まったく適用されないかのいずれかです。

MyISAMはトランザクションをサポートしていませんが、InnoDBはサポートしています。

MyISAMテーブルの使用中に操作が中断されると、操作はすぐに中止され、操作が完了していなくても、影響を受ける行(または各行内のデータ)も影響を受けます。

InnoDBテーブルの使用中に操作が中断されると、アトミック性のあるトランザクションを使用するため、コミットが行われないため、完了に至らなかったトランザクションは有効になりません。

テーブルロックと行ロック

MyISAMテーブルに対してクエリを実行すると、クエリを実行しているテーブル全体がロックされます。つまり、後続のクエリは、現在のクエリが終了した後にのみ実行されます。大きなテーブルを読み取る場合や、読み取りと書き込みの操作が頻繁に行われる場合は、クエリのバックログが膨大になる可能性があります。

InnoDBテーブルに対してクエリを実行すると、関連する行のみがロックされ、テーブルの残りの部分はCRUD操作に引き続き使用できます。つまり、同じ行を使用しない限り、同じテーブルでクエリを同時に実行できます。

InnoDBのこの機能は並行性と呼ばれます。同時実行性と同様に、カーネルスレッド間の切り替えにオーバーヘッドがあり、サーバーが停止しないようにカーネルスレッドに制限を設定する必要があるという点で、テーブルの選択範囲に適用される大きな欠点があります。 。

トランザクションとロールバック

MyISAMで操作を実行すると、変更が設定されます。 InnoDBでは、これらの変更をロールバックできます。トランザクションの制御に使用される最も一般的なコマンドは、COMMIT、ROLLBACK、およびSAVEPOINTです。 1. COMMIT-複数のDML操作を書き込むことができますが、変更はCOMMITが行われたときにのみ保存されます2. ROLLBACK-まだコミットされていない操作は破棄できます3. SAVEPOINT-リストのポイントを設定しますROLLBACK操作がロールバックできる操作

信頼性

MyISAMはデータの整合性を提供しません-ハードウェア障害、不適切なシャットダウン、キャンセルされた操作により、データが破損する可能性があります。これには、インデックスとテーブルの完全な修復または再構築が必要になります。

一方、InnoDBはトランザクションログ、二重書き込みバッファ、および自動チェックサムと検証を使用して破損を防止します。 InnoDBが変更を行う前に、トランザクションの前のデータをibdata1と呼ばれるシステムテーブルスペースファイルに記録します。クラッシュが発生した場合、InnoDBはそれらのログの再生を通じて自動復旧します。

フルテキストインデックス

InnoDBは、MySQLバージョン5.6.4までFULLTEXTインデックスをサポートしません。この投稿の執筆時点では、多くの共有ホスティングプロバイダーのMySQLバージョンはまだ5.6.4未満です。つまり、FULLTEXTインデックスはInnoDBテーブルではサポートされていません。

ただし、これはMyISAMを使用する正当な理由ではありません。 MySQLの最新バージョンをサポートするホスティングプロバイダーに変更することをお勧めします。 FULLTEXTインデックスを使用するMyISAMテーブルはInnoDBテーブルに変換できないことに注意してください。

結論

結論として、InnoDBはデフォルトのストレージエンジンとして選択する必要があります。特定のニーズに対応する場合は、MyISAMまたはその他のデータタイプを選択します。

2
d4nyll

ログ形式のデータにテーブルを使用しているのでない限り(最近はINSERTよりSELECTが多く、トランザクションがない)InnoDBは通常、より高速で信頼性が高く、機能が多いなどです。

MyISAMが持つ他の唯一の機能は、基本的な使用には問題ないフルテキスト検索ですが、ほとんどの人は、Luceneの一部を深刻なものに使用します。

どちらの方法でも、デフォルトは他のサービスと共有される32MBのペンティアムに設定されているため、MySQLを調整する必要があります。

2
LapTop006

一般に、経験則では、速度が必要な場合はMyISAMを使用し、安定性が必要な場合はInnoDBを使用します。私が正しく覚えているなら、原子性と何か関係があります。

1
sybreon