現在のWebプロジェクトのデータベースとしてMySQLを使用しています。私はMySQLが初めてです。InnoDBとMyISAMの違いを説明してください。
現在のWebプロジェクトのデータベースとしてMySQLを使用しています。私はMySQLが初めてです。InnoDBとMyISAMの違いを説明してください。
回答:
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データベースはすべてのサブクエリを実行する必要がありますレコードを手動で並べて一致させます。
それ以上の詳細が必要な場合は、データベースでコースを実行する必要があります!
最も基本的なことは、InnoDBがトランザクションであることです。MyIsamは違います。MyIsamは一般に少し高速なので、トランザクションが必要ない場合は一般的に最善策です。詳細な説明については、MySQLのドキュメントをお読みください。
ゲームに少し遅れました...しかし、ここ数か月前に書いた非常に包括的な記事で、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またはその他のデータタイプを選択します。
一般に、経験則では、速度が必要な場合はMyISAMを使用し、安定性が必要な場合はInnoDBを使用します。正しく覚えていれば、原子性と関係があります。