この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 13183|答える: 0

[出典] MyISAMはMySQLデータベースストレージエンジンとInnoDBの違いです

[リンクをコピー]
掲載地 2020/04/13 9:53:49 | | |
MySQLに関して言えば、MyISAMやInnoDBは最も有名で広く使われているMySQLストレージエンジンの二つを理解するのは難しいでしょう。 今日はMySQLにおけるMyISAMとInnoDBの違いについてお話しします...

MyISAMとは何ですか?

MyISAMは、MySQLリレーショナルデータベース管理システム(5.5以前)のデフォルトのストレージエンジンです。 このMySQLテーブルストレージ構造は、旧ISAMコードから多くの有用な機能を拡張しています。 MySQLの新バージョンでは、トランザクション、参照整合性、高い同時実行性という利点から、InnoDBエンジンがMyISAMに大きく取って代わりつつあります。
各MyISAMテーブルはハードディスク上の3つのファイルに対応しています。 3つのファイルはすべて同じファイル名を持ちますが、形式目的を示す拡張子が異なります:.frmファイルはテーブルの定義を保持しますが、このファイルはMyISAMエンジンの一部ではなくサーバーの一部です。.MYDはテーブルのデータを持ち、.MYIはテーブルのインデックスファイルです。

InnoDBとは何ですか?

InnoDBはMySQL用の別のストレージエンジンであり、MySQL ABがリリースした標準の新バージョンはすべてのバイナリインストールパッケージに含まれています。5.5以降はデフォルトのストレージエンジンとして。 他のストレージエンジンと比べての利点は、ACID互換トランザクション(PostgreSQLに類似)とパラメータ整合性(外部鍵のサポート)をサポートすることです。

オラクル・コーポレーションは2005年10月にInnobaseを買収しました。 Innobaseはデュアル認証認証を使用しています。 GNUで配布されており、商用ソフトウェアにInnoDBを取り入れたい他のグループがライセンスを取得することも可能です。

最も人気のあるストレージエンジンはMyISAMとInnoDBです。 MyISAMとInnoDBの主な違いはパフォーマンスとトランザクション制御にあります。 MyISAMは初期のISAM(インデックス付き逐次アクセス法、MySQL 5.0以降はISAMはサポートされなくなりました)の拡張実装です。ISAMは読み取り頻度が書き込み周波数を大きく上回る状況に対応するために設計されており、ISAMおよび後のMyISAMはサポートを考慮しず、TPMを除外し、トランザクションレコードも不要で、ISAMクエリ効率もかなり高く、メモリ消費も非常に少ないです。
MyISAMはこれらの利点を受け継ぎつつ、時代に合わせて多くの便利な新機能や関連ツールを搭載しています。 例えば、並行制御を考慮すると、テーブルレベルのロックが提供されており、MyISAM自体はフォールトトレランスをサポートしていませんが、myisamchkを通じて障害からの回復に利用できます。 また、MyISAMは各テーブルごとに独立したストレージファイル(MYDデータファイルとMYIインデックスファイル)を使用しているため、バックアップやリストアが非常に便利で(コピーの上書きで十分)、オンラインリカバリーもサポートしています。 他のストレージエンジンと比べて、MyISAMはテーブルのチェックや修復に最も多くのツールを備えています。 MyISAMテーブルは圧縮可能で、全文検索もサポートしています。 トランザクション安全ではなく、外部キーもサポートしていないので、もしアプリケーションがトランザクションを必要としず、基本的なCRUD操作のみを処理するなら、MyISAMが最適です。
InnoDBは、MVCC(マルチバージョン同時処理制御)と行レベルのロックを用いて、高並行読み書き状況向けに設計されており、ACID準正のトランザクションサポートを提供します。 InnoDBは外部鍵参照の整合性をサポートし、故障復旧機能を備えています。 さらに、InnoDBのパフォーマンスは公式に言えば非常に優れており、特に大量のデータ処理においては優れています。InnoDBのCPU効率は他のディスクベースのリレーショナルデータベースストレージエンジンと比べられません。 しかし、InnoDBのバックアップと復旧はやや厄介で、バージョン4.1以降で提供されているマルチテーブルスペースサポートを使わない限り、MyISAMとは異なり、InnoDBのデータファイルは各テーブルに独立に対応していません。 代わりに共有テーブルスペースが使われ、単純なコピーオーバーライティング方式は適さず、MYSQLを停止した後にデータを復元しなければなりません。 テーブルごとのtablespacedを使うことで、各テーブルが別々のテーブルスペースファイルに対応し、状況はずっと単純になります。 BDBタイプと同じ特性を持ち、外部キーもサポートしています。 InnoDBのテーブルは高速で、BDBよりも機能が豊富なため、トランザクション的に安全なストレージエンジンが必要な場合は推奨されます。

一般的に、トランザクションサポートが必要で、読み書きの同時回数が多い場合、InnoDBは良い選択肢です。 同時読み書きの頻度が高くない場合はBDBを検討できますが、MySQL 5.1以降のバージョンではBDBはサポートされません。 この選択肢はなくなりました

デフォルトでは、InnoDBトランザクションはオープン(オートコミット=0設定)であり、レコードが挿入されるたびにInnoDBテーブルはそれを別のトランザクションとして扱います。 したがって、1万件のレコードを挿入してトランザクションを閉じない場合、InnoDB型テーブルはそれを1万トランザクションとして扱い、この時点で挿入までの総時間は非常に長いです。この時点ではまずトランザクションをオフにしてから挿入しなければなりません。そのため速度は非常に速くなります。HeapやBDB(Berkeley DB)の場合、相対的に見て浸透率は前の2つほど良くありませんが、場合によっては ヒープストレージエンジンは依然として非常に適用可能で、メモリにデータを保存し、ディスクI/Oの待機がないため非常に高速です。 しかしメモリストレージエンジンなので、サーバー再起動後に変更は消えてしまいます。 ヒープは、MySQL初のトランザクション的に安全なストレージエンジンであるため、テストにBDBを使うのに最適な場所です。 Berkeley DBデータベースライブラリをベースに構築されており、トランザクション面でも安全ですが、BDBはInnoDBほど人気はありません。なぜなら、トランザクションをサポートするMySQLのストレージエンジンの多くはMVCCや行レベルのロックを探しているのに対し、BDBはページレベルのロックのみをサポートしているからです。

InnoDBエンジン

InnoDBはロールバックをサポートするトランザクションストレージエンジンで、大量のデータ処理時に高性能なサービスを提供するよう設計されています。また、実行時にメモリ内にバッファプールを設定してデータやインデックスをバッファリングします。

InnoDBエンジンの利点:

1. トランザクション処理およびACIDトランザクション機能のサポート;

2. SQL標準の4つの分離レベルが実現されます。

3. 行レベルのロックおよび外部鍵制約のサポート;

4. トランザクションログを使ってデータ復旧が可能です。

5. ロックレベルは行ロックであり、頻繁なテーブル変更に適しており、高並行性はMyISAMよりも優れています。 欠点はシステムの消費量が大きいことです。

6. インデックスは自身だけでなくデータをキャッシュするだけでなく、MyISAMよりも多くのメモリを必要とします。

InnoDBエンジンの欠点:

テーブル内の行数を保存しないため、COUNT統計を使うとテーブル全体をスキャンします。

MyISAMエンジン

MyISAMはMySQL 5.5.5以前のデフォルトエンジンで、高速に読み込まれるよう設計されています。

MyISAMエンジンの利点:

1. 高性能読書;

2. テーブル内の行数を保存するため、COUNT統計を使うとテーブル全体をスキャンしません。

MyISAMエンジンの欠点:

1. ロックレベルはテーブルロックであり、ウォッチロックの利点はオーバーヘッドが小さく、ロックが速いことです。 欠点としては、ロックの粒度が大きく、ロックインパルスの確率が高く、並行処理能力が低いためクエリベースのサービスに適しています。

2. このエンジンはトランザクションや外部鍵をサポートしません。

3. INSERTおよびUPDATE操作はテーブル全体をロックする必要があります。

4. テーブル内の行数を保存するため、SELECT COUNT(*) from tableを操作すると、テーブル全体をスキャンせずに保存した値だけを直接読み取る必要があります。

適用シナリオ

MyISAMは以下に適しています:(1) 多くのカウント計算; (2) 挿入頻度が低く、クエリが非常に頻繁であること; (3) ビジネスは存在しない。

InnoDBは以下に適しています:(1) 高い信頼性要件やトランザクション; (2) テーブルの更新やクエリは非常に頻繁に行われ、テーブルロックのリスクも比較的高いです。

表比較

性質マイISAMヒープBDBInnoDB
取引サポートされていませんサポートされていません支持して支持して
ロックの粒度テーブルロックテーブルロックページロック(ページ、8KB)ロック
貯蔵分割ファイル追悼テーブルごとに1つのファイルテーブルスペース
隔離レベルじゃないじゃないコミットドを読んでくださいすべての
ポータブルフォーマットいる該当なしじゃないいる
引用の完全性じゃないじゃないじゃないいる
データ主キーじゃないじゃないいるいる
MySQLはデータレコードをキャッシュしますじゃないはいはいはい
ユーザビリティ完全版完全版MySQL-Max完全版


詳細の違い


1. InnoDBはFULLTEXT型のインデックスをサポートしていませんが、これはMySQL 5.6(実験的)からサポートされています。

2. InnoDBはテーブルの特定の行数を保存しません。つまり、テーブルからcount()を選択する際には、行数を計算するためにテーブル全体をスキャンする必要がありますが、MyISAMは単に保存された行数を読み取るだけで済みます。 count() 文に where 条件が含まれている場合、両方のテーブルで操作は同じです。

3. AUTO_INCREMENTタイプのフィールドの場合、InnoDBはそのフィールドのみを含むインデックスを含まなければなりませんが、MyISAMテーブルでは他のフィールドと共同インデックスを作成できます。

4. テーブルから削除する際、InnoDBはテーブルを再作成せず、行ごとに削除します。

5. LOAD TABLE FROM MASTER 操作は InnoDB では機能しません。解決策はまず InnoDB テーブルを MyISAM テーブルに変更し、データをインポートしてから InnoDB テーブルに変更することですが、外部キーなど追加の InnoDB 機能を使うテーブルには適用できません。

6. さらに、InnoDBテーブルの行ロックは絶対的ではなく、SQL文を実行する際にMySQLがスキャン範囲を特定できない場合、InnoDBテーブルはテーブル全体もロックします。

7. InnoDBは全文インデックス作成をサポートしていませんが、MyISAMは対応しています。 全文索引付けとは、char、varchar、テキストの各単語(ストップワードを除く)の逆順インデックスを作成することを指します。 MyISAMの全文索引は実は役に立ちません。なぜなら中国語の単語分割に対応しておらず、単語分割後にユーザーがデータテーブルに書き込む必要があるからです。また、4文字未満の中国語の単語は停止語のように無視されます。





先の:実験的な質問を組み立てる
次に:SQL文からVarchar型への変換
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com