web-dev-qa-db-ja.com

MySql:MyISAMとInnodb!

MySqlのMyISAMタイプとInnoDBタイプの違いは何ですか?

43
Arron S

主な違いは、InnoDBはトランザクションをサポートしますが、MyISAMはサポートしないことです。

他にも多くの違いがありますが、私が知っている一般的な違いは次のとおりです。

  • MyISAMは通常、検索が高速であると見なされてきましたが、最近のInnoDBの改善により、この違いがなくなり、同時実行性の高いワークロードのパフォーマンスが向上しています。
  • InnoDBはトランザクションをサポートしますが、MyISAMはサポートしません
  • InnoDBは参照整合性をサポートしますが、MyISAMはサポートしません
  • InnoDBはインデックスの処理方法が少し異なり、すべてのインデックスの一部として主キーを格納します(インデックスがディスク上でより多くのスペースを占めるようにするだけでなく、カバーするインデックスの可能性も高くなります)
  • MyISAMはテーブルレベルのロックを実行し、InnoDBは行レベルのロックを実行できます
  • MySQL構成ファイルで異なるメモリ/バッファ/インデックス設定が使用されます
  • InnoDBは通常、クラッシュリカバリが優れていると言われています
  • 別の回答で述べたように、データは異なる方法でディスクに保存されます。 InnoDBはこの領域で構成可能であり、必要に応じてテーブルごとに1つのファイルなどを持つことができると思います

私はグーグル検索またはMySQLサイトがより詳細に他の多くの違いをもたらすと確信しています。

54
Jarod Elliott

InnoDBとMyISAM

機能とパフォーマンスの比較:

  1. InnoDBは新しく、MyISAMは古いです。
  2. InnoDBはより複雑ですが、MyISAMはより単純です。
  3. InnoDBはデータの整合性がより厳密ですが、MyISAMは緩いです。
  4. InnoDBは挿入と更新のための行レベルのロックを実装し、MyISAMはテーブルレベルのロックを実装します。
  5. InnoDBにはトランザクションがありますが、MyISAMにはありません。
  6. InnoDBには外部キーと関係の制約がありますが、MyISAMにはありません。
  7. InnoDBのクラッシュリカバリは優れていますが、MyISAMはシステムクラッシュ時のデータ整合性のリカバリが不十分です。
  8. MyISAMには全文検索インデックスがありますが、InnoDBにはありません。

これらの違いに照らして、InnoDBとMyISAMには、互いに独自の長所と短所があります。シナリオによっては、それぞれが他よりも適しています。

InnoDBの利点

  1. InnoDBは、関係の制約とトランザクションの助けを借りて本質的にデータの整合性を処理するため、データの整合性が優先される場合に使用する必要があります。
  2. 行レベルのロックを利用し、挿入または更新されているのと同じ行への変更のみを保持するため、書き込みの多い(挿入、更新)テーブルでの処理が高速になります。

InnoDBのデメリット

  1. InnoDBはテーブル間のさまざまな関係を処理する必要があるため、データベース管理者とスキーム作成者は、MyISAMよりも複雑なデータモデルの設計に多くの時間を費やす必要があります。
  2. RAMなどのより多くのシステムリソースを消費します。実際のところ、MySQLのインストール後に実質的に必要がない場合は、InnoDBエンジンをオフにすることを多くの人が推奨しています。
  3. フルテキストインデックスはありません。

MyISAMの利点

  1. 設計と作成が簡単なので、初心者に適しています。テーブル間の外部関係についての心配はありません。
  2. 構造が単純なため、全体としてInnoDBよりも高速であるため、サーバーリソースのコストが大幅に削減されます。
  3. 全文索引付け。
  4. 読み取りが集中する(選択された)テーブルに特に適しています。

MyISAMのデメリット

  1. データの整合性(関係の制約など)のチェックは行われず、データベース管理者とアプリケーション開発者の責任とオーバーヘッドが発生します。
  2. 銀行などの重要なデータアプリケーションに不可欠なトランザクションはサポートしていません。
  3. テーブル全体が挿入または更新のためにロックされているため、頻繁に挿入または更新されるテーブルのInnoDBよりも低速です。

比較は非常に簡単です。 InnoDBは、頻繁な挿入と更新を必要とするデータクリティカルな状況に適しています。一方、MyISAMは、データの整合性にまったく依存せず、ほとんどの場合、データを選択して表示するだけのアプリケーションでパフォーマンスが向上します。

参照:InnoDBとMyISAMの比較

詳細については、こちらで確認することもできます: MyISAMまたはInnoDB MySQLエンジン?

お役に立てれば。

19
AlphaMale

MyISAMは、InnoDBがまだサポートしていない(非標準SQL)フルテキストインデックス作成をサポートしています。これが、今日MyISAMを使用する唯一の理由です。

16
bobince

MyISAMとInnoDBの最も重要な違いは、InnoDBがトランザクションと外部キーをサポートしていることです。外部キーと関連機能(たとえば、削除を自動的にカスケードする)が必要な場合は、InnoDBを使用する必要があります。

InnoDBは、ほとんどの用途でMyISAMよりも低速ですが、ロックメカニズムが優れているため、特定の条件で高速に実行できます。 MyISAMは、挿入/更新の実行中にテーブル全体を読み取り用にロックします。 InnoDBは行レベルのロックを実行できるため、テーブルでの複数の同時書き込みと読み取りが可能です。

4

MyISAMとInnoDBの詳細については、MySQLドキュメントを参照してください。

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

http://dev.mysql.com/doc/refman/5.1/en/innodb-overview.html

3
sebthebert

InnoDBの機能1.完全なACID(Atomicity、Consistency、Isolation、およびDurability)に準拠した完全なトランザクション機能を提供します。

  1. 行レベルのロックがあります。行レベルのロックをサポートすることで、挿入のたびにエンジンがテーブルをロックすることなく、InnoDBテーブルにデータを追加できます。これにより、データベース内の情報の回復と保存の両方が高速化されます。

  2. InnoDBシステムの鍵は、データベース、キャッシュ、およびインデックス構造であり、インデックスとデータの両方がメモリにキャッシュされ、ディスクに保存されます。これにより、非常に高速なリカバリが可能になり、非常に大きなデータセットでも機能します。

  3. InnoDBは外部キー制約をサポートします

  4. InnoDBは自動クラッシュリカバリをサポートしています
  5. InnoDBはテーブル圧縮(読み取り/書き込み)をサポートします
  6. InnoDBは空間データ型をサポートします(空間インデックスなし)

  7. Innodbは非ロックのANALYZETABLEをサポートしており、サーバーがインデックス統計に飛び込んでテーブルが開いたときにインデックス情報を取得するため、サーバーが長時間実行されている場合にのみ必要です。

  8. Innodbには個別のインデックスファイルがないため、開く必要はありません。

  9. Innodbは、プライマリキーの順序(ALTERの後)で一度に1行ずつインデックスを構築します。つまり、インデックスツリーは最適な順序で構築されず、フラグメント化されます。InnoDBは構築できないため、現在InnoDBインデックスをデフラグする方法はありません。 MySQL5.0でソートすることによるインデックス。 InnoDBインデックスを削除して再作成しても、データによってはインデックスが断片化する可能性があります。

  10. テーブルには最大1000列を含めることができます。

  11. InnoDBの内部最大キー長は3500バイトですが、MySQL自体はこれを3072バイトに制限しています。 (MySQL 5.0.17より前の非64ビットビルド、および5.0.15より前のすべてのビルドの場合は1024バイト。)

  12. InnoDBのデフォルトのデータベースページサイズは16KBです。コードを再コンパイルすることにより、8KBから64KBの範囲の値に設定できます。 univ.iソースファイルのUNIV_PAGE_SIZEおよびUNIV_PAGE_SIZE_SHIFTの値を更新する必要があります。
  13. InnoDBテーブルはFULLTEXTインデックスをサポートしていません。

    MYISAMの機能

    1. トランザクションサポートなし
    2. テーブルレベルのロック
    3. 全文検索を提供します
    4. テーブル内のデータに制限はありません。
    5. 高速COUNT(*)(WHERE、GROUP BY、またはJOINが使用されていない場合)
    6. 全文索引付け
    7. ディスクフットプリントが小さい
    8. 非常に高いテーブル圧縮(読み取り専用)
    9. 空間データ型とインデックス(Rツリー)
  14. DATA DIRECTORY = '/ path/to/data/directory'またはINDEXDIRECTORY = '/ path/to/index/directory'を使用すると、MyISAMストレージエンジンがテーブルのデータファイルとインデックスファイルを配置する場所を指定できます。ディレクトリは、相対パスではなく、ディレクトリへのフルパス名である必要があります。

詳細については、 http://faisalbhagat.blogspot.com/2014/09/innodb-vs-myisam.html をご覧ください。

1
faisalbhagat

主な違いは、InnoDBは transactions をサポートしているのに対し、MyISAMはサポートしていないことです。

1
Greg

NFSサポート

MyISAMとは異なり、InnoDBではNFSで問題が発生する可能性があります。

From InnoDB(MySQLバージョン5.5)の構成

注意

信頼性がデータの考慮事項である場合は、NFSボリューム上のデータファイルまたはログファイルを使用するようにInnoDBを構成しないでください。潜在的な問題は、OSとNFSのバージョンによって異なり、競合する書き込みからの保護の欠如、最大ファイルサイズの制限などの問題が含まれます。

1

MyISAMとInnoDBも、データを異なる方法でディスクに保存します。 MyISAMは、データベースにちなんで名付けられたディレクトリに保存されている、各テーブルのデータファイルとインデックスファイルを使用します。 InnoDBは、ibdata1というファイルにすべてをまとめているようです。

1
Greg

トランザクションのサポートが主な違いですが、 長時間実行されるSELECTクエリとUPDATEステートメントが混在している の場合、テーブルレベルのロックが問題になる可能性があります。

0
user187380

InnoDBとMyIsamの違いの説明は次のとおりです。

InnoDBとMyIsamの違い

いくつかの違い:

  • [〜#〜] myisam [〜#〜]はデータベーストランザクションをサポートしていません。
  • [〜#〜] innodb [〜#〜]はトランザクションを提供します
  • [〜#〜] myisam [〜#〜]は、テーブルレベルのロックを提供します。
  • [〜#〜] innodb [〜#〜]は行レベルのロックを提供します
  • [〜#〜] innobd [〜#〜]は外部キーをサポートします、[〜#〜] myisam [〜 #〜]はしません...
0
Fred

MyISAMは、すべてのテーブルをロックしてファイルをファイルシステムに直接コピーするのがかなり簡単なので、バックアップに関してはより便利です。 (Perlスクリプトであるmysqlhotcopyはmysql afaikの一部です)

InnoDBはもう少し複雑で、ファイルをコピーするだけでは、すぐに使用できる別のマシンに復元できないため、機能しません。

ただし、InnoDBホットコピーを提供する商用ソフトウェアがあります。

0
jishi