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


17

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


MySQLタグも自由に追加してください:)
Johan

これはstackoverflowに属していませんか?
ripper234 09

@ ripper234。この投稿には、stackoverflow.com / q / 12614541/209139stackoverflow.com/q/20148/209139の 2つの優れたバージョン(より多くの背景、以前の研究のより多くのデモ)があります。
TRiG

回答:


14

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

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

ISAMは、大量のレコード(2,000万など)があり、レコードがほとんどスタンドアロンである場合(つまり、関連付けられたデータを取得するために多くのリンクを行う必要がない場合)に優れています。インデックスに非常に重く依存しており、適切なインデックスがない場合は、非常に長いクエリ時間に備えてください。適切な事例:20M +のレコードを持つBtrieve ISAMテーブルがあり、正確なインデックスに基づいてデータを取得およびフィルター処理することはほとんど瞬時でした。間違ったインデックスの使用は、文字通り15分でした。

InnoDBは、多くのリレーショナルリンクがある場合に最適です。テーブルAはテーブルBのフィールドを参照し、テーブルCおよびDを参照します。InnoDBはあらゆる種類の素晴らしい結合方法(ハッシュ結合など)を使用してこれらのレコードをフェッチできますが、ISAMデータベースはすべてのサブクエリを実行する必要がありますレコードを手動で並べて一致させます。

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


ISAMは他のものと同様にリレーショナルであり、最適化されていません。
LapTop006 09

ありがとう4あなたの簡単な説明。今、基本的に私はクリアしています

5

最も基本的なことは、InnoDBがトランザクションであることです。MyIsamは違います。MyIsamは一般に少し高速なので、トランザクションが必要ない場合は一般的に最善策です。詳細な説明については、MySQLのドキュメントをお読みください。


2

ログスタイルデータにテーブルを使用している場合(最近ではSELECTよりも多くのINSERT、トランザクションなし)を除き、InnoDBは通常、より高速で、より信頼性が高く、より多くの機能を備えています。

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

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


2

ゲームに少し遅れました...しかし、ここ数か月前に書いた非常に包括的な記事で、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未満です。つまり、InnoDBテーブルではFULLTEXTインデックスはサポートされていません。

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

結論

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


1

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


3
もはや真実ではない抜粋、InnoDBは実際にはほとんどの場合高速です。
LapTop006 09

1
誰かがいくつかのベンチマークや何かリンクを追加できますか?
ヨハン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.