MySQL ストレージ エンジン MyISAM と InnoDB の違いの概要

MySQL ストレージ エンジン MyISAM と InnoDB の違いの概要

1. MySQLのデフォルトストレージエンジンの変更

MySQL 5.1 より前のバージョンでは、デフォルトの検索エンジンは MyISAM です。MySQL 5.5 以降では、デフォルトの検索エンジンは InnoDB に変更されます。

2. MyISAMとInnoDBストレージエンジンの主な機能

MyISAM ストレージ エンジンの特徴は、テーブル レベルのロック、トランザクションとフルテキスト インデックスのサポートがないことであり、バックエンド データベースとして一部の CMS コンテンツ管理システムに適しています。ただし、テーブル ロック構造は、同時実行性が高く、負荷の高い運用システムには不十分です。

MySQL 5.7 MyISAM ストレージ エンジンの機能は次のとおりです。

InnoDB ストレージ エンジンの機能は、行レベルのロック、トランザクション セキュリティ (ACID 互換性)、外部キーのサポート、FULLTEXT タイプのインデックスのサポートです (FULLTEXT タイプのインデックスはバージョン 5.6.4 以降でサポートされています)。 InnoDB ストレージ エンジンは、コミット、ロールバック、クラッシュ回復機能を備えたトランザクション セーフ ストレージ エンジンを提供します。 InnoDB は、膨大なボリュームを処理するときに最大のパフォーマンスを発揮するように設計されています。その CPU 効率は、おそらく他のディスクベースのリレーショナル データベース エンジンとは比べものにならないほど優れています。

MySQL 5.7 InnoDB ストレージ エンジンの機能は次のとおりです。

知らせ:

InnoDB テーブルの行ロックは絶対的ではありません。SQL ステートメントの実行時に MySQL がスキャンする範囲を決定できない場合、InnoDB テーブルはテーブル全体をロックします (例: update table set num=1 where name like “a%”

2 つのタイプの主な違いは、InnoDB がトランザクション、外部キー、行レベルのロックをサポートしていることです。 MyISAM はこれをサポートしていません。したがって、MyISAM は小規模なプロジェクトでの使用にのみ適していると考えられることがよくあります。

3. MyISAMとInnoDBのパフォーマンステスト

次の2枚の写真はMyISAMとInnoDBの公式ストレステスト結果です。

CPU コアの数が増えるにつれて、InnoDB のスループットが向上しますが、MyISAM のスループットはほとんど変化しないことがわかります。明らかに、MyISAM のテーブル ロック メカニズムによって読み取りおよび書き込みのスループットが低下します。

4. トランザクションがサポートされているかどうか

MyISAM は非トランザクション エンジンであり、MyISAM エンジンを搭載した MySQL は高速なストレージと取得、および全文検索機能を提供できるため、データ ウェアハウスなどの頻繁にクエリを実行するアプリケーションに適しています。

InnoDB はトランザクションセーフです。

トランザクションは高度な処理方法です。例えば、列の追加、削除、変更中にエラーが発生した場合、トランザクションをロールバックして復元することができますが、MyISAM ではこれができません。

5. MyISAMとInnoDBの構造の違い

(1)各MyISAMはディスク上の3つのファイルに保存されます。

最初のファイルの名前はテーブル名で始まり、拡張子はファイルの種類を示します。.frm ファイルにはテーブル定義が保存されます。
2 番目のファイルは、拡張子が .MYD (MYData) のデータ ファイルです。
3 番目のファイルはインデックス ファイルであり、拡張子は .MYI (MYIndex) です。

(2) ディスクベースのリソースは、InnoDB テーブルスペースのデータ ファイルとそのログ ファイルです。InnoDB テーブルのサイズは、オペレーティング システム ファイルのサイズによってのみ制限され、通常は 2 GB です。

6. MyISAMとInnoDBのテーブルロックと行ロックの説明

MySQL テーブル レベルのロックには、テーブル共有読み取りロック (テーブル読み取りロック) とテーブル排他書き込みロック (テーブル書き込みロック) の 2 つのモードがあります。これは何を意味するのでしょうか? MyISAM テーブルが読み取られる場合、同じテーブルに対する他のユーザーの読み取り要求はブロックされませんが、同じテーブルへの書き込み操作はブロックされます。また、MyISAM テーブルへの書き込み操作は、同じテーブルに対する他のユーザーの読み取りおよび書き込み操作をブロックします。

InnoDB の行ロックは、インデックス項目をロックすることによって実装されます。つまり、InnoDB は、データがインデックス条件を通じて取得される場合にのみ行レベルのロックを使用し、それ以外の場合はテーブル ロックを使用します。行レベルのロックは、ロックの取得および解放操作ごとに、テーブル ロックよりも多くのリソースを消費します。 2 つの InnoDB トランザクションがデッドロックすると、各トランザクションによって影響を受ける行数が計算され、行数が少ないトランザクションがロールバックされます。 InnoDB がロック シナリオに関与していない場合、InnoDB はそれを検出できません。タイムアウトをロックすることによってのみ解決できます。

7. データベーステーブルに特定の行数を保存するかどうか

InnoDB はテーブル内の特定の行数を保存しません。つまり、 select count(*) from tableを実行すると、InnoDB は行数を計算するためにテーブル全体をスキャンする必要がありますが、MyISAM は保存された行数を単に読み取ります。

count(*)ステートメントにwhere条件が含まれている場合、操作は両方のテーブルに対して同じになることに注意してください。これは、上記の「6」で紹介したように、InnoDB がテーブル ロックを使用する場合です。

8. 選び方

MyISAM は次の場合に適しています:

  • (1)カウント計算をたくさん行う
  • (2)挿入は頻繁に行われませんが、クエリは頻繁に行われます。大量のSELECTが実行される場合は、MyISAMの方が適しています。
  • (3)取引は行いません。

InnoDB は次の場合に適しています:

  • (1)高い信頼性の要件または取引が求められる場合
  • (2)テーブルの更新やクエリが頻繁に行われ、テーブルがロックされる可能性が高い場合は、データエンジンの作成を指定します。
  • (3)データに対して大量のINSERTやUPDATEを実行する場合は、パフォーマンス上の理由からInnoDBテーブルを使用する必要があります。
  • (4)DELETE FROM tableを使用すると、InnoDBはテーブルを再作成せず、行を1つずつ削除します。
  • (5) LOAD TABLE FROM MASTER 操作は InnoDB では機能しません。解決策としては、まず InnoDB テーブルを MyISAM テーブルに変更し、データをインポートした後に InnoDB テーブルに戻すことです。ただし、これは追加の InnoDB 機能 (外部キーなど) を使用するテーブルには適用されません。

各テーブルを作成するコードは、データ エンジンを指定する最後の TYPE パラメータを除いて同一であることに注意してください。

その他の違い:

1. AUTO_INCREMENT タイプのフィールドの場合、InnoDB にはこのフィールドのみを持つインデックスが含まれている必要がありますが、MyISAM テーブルでは他のフィールドとの結合インデックスを作成できます。

2. DELETE FROM table を使用すると、InnoDB はテーブルを再作成せず、行を 1 つずつ削除します。

3. LOAD TABLE FROMMASTER 操作は InnoDB では機能しません。解決策としては、まず InnoDB テーブルを MyISAM テーブルに変更し、データをインポートした後で InnoDB テーブルに戻すことです。ただし、これは追加の InnoDB 機能 (外部キーなど) を使用するテーブルには適用されません。

4. InnoDB ストレージ エンジンは MySQL サーバーと完全に統合されています。InnoDB ストレージ エンジンは、データとインデックスをメイン メモリにキャッシュするための独自のバッファー プールを維持します。

5. 自己増分フィールドの場合、InnoDB にはこのフィールドのみのインデックスが含まれている必要がありますが、MyISAM テーブル内の他のフィールドとの共同インデックスを作成できます。

6. テーブル全体をクリアする場合、InnoDB は行を 1 つずつ削除するため、非常に遅くなります。 MyISAM はテーブルを再構築します。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQL の分離レベル、ロック、MVCC の紹介
  • MySQLでデータテーブルを作成するときにエンジンMyISAM/InnoDBを設定する
  • MySQL における楽観的ロック、悲観的ロック、MVCC の包括的な分析
  • MySQL InnoDB ストレージエンジンのメモリ管理の詳細な説明
  • MySQLのInnoDBストレージエンジンにおけるさまざまなロックの詳細な説明
  • MySQLのInnoDBストレージエンジンのデータページ構造の詳細な説明
  • MySQL ストレージ エンジン InnoDB と MyISAM
  • MYSQL データベース Innodb エンジン mvcc ロック実装原理

<<:  Windows システムに VirtualBox と Ubuntu 16.04 をインストールするための詳細なチュートリアル

>>:  JSはモバイル端末の画面を1つずつ上下にスライドさせる機能を実装します

推薦する

JS配列インデックス検出におけるデータ型の問題の詳細な説明

WeChat アプレット プロジェクトを書いていたとき、その中に「都市選択」機能がありました。作者は...

HTML の基本的な使用法には、リンク、スタイルシート、span、div などが含まれます。

1. リンクハイパーテキスト リンクは HTML において非常に重要です。基本的な形式は次のとおりで...

CocosCreator 学習モジュールスクリプト

Cocos Creator モジュラースクリプトCocos Creator を使用すると、コードを複...

Tomcat を IDEA にダウンロード、インストール、デプロイするチュートリアル (IDEA の 2 つのホット デプロイ設定方法付き)

目次Tomcat ダウンロードチュートリアルTomcat インストールチュートリアルTomcat の...

ドロップダウンリスト選択ボックスを実装するJavaScript

この記事の例では、ドロップダウンリスト選択ボックスを実装するためのJavaScriptの具体的なコー...

MySQL での重複キー更新時の replace into と insert into の使用法と相違点の分析

この記事では、MySQL での重複キー更新時の replace into と insert into...

Vueはテーブルページング機能を実装します

この記事では、テーブルページング機能を実現するためのVueの具体的なコードを例として紹介します。具体...

Nginx の書き換え正規マッチング書き換え方法の例

Nginx の書き換え機能は、リダイレクトと同様に、URL アドレスを一時的または永続的に新しい場所...

Nginx でバージョン番号を隠したり偽造したりする方法

1. デフォルトでアクセスするには、curl コマンドを使用します。 # curl -I http:...

外部ファイル(js/vbs/css)をインポートするときに文字化けを回避する方法

ページ内にはjs、cssなどの外部ファイルが導入されており、外部ファイルのエンコードが現在のページフ...

Mysql データベースの日付と日時型でデフォルト値 0000-00-00 を設定するときに発生するエラー問題の詳細な説明

現象: MySQL バージョン 5.7 以降では、日付型と日付時刻型のデフォルト値が「0000-00...

MySQLはカスタム関数を使用して親IDまたは子IDを再帰的に照会します

背景: MySQL では、レベルに制限がある場合、たとえば、ツリーの最大深度を事前に決定できる場合、...

MySQL に IP アドレスを効果的に保存する方法と、文字列 IP と数値を変換する方法の詳細な説明

High Performance MySQL バージョン 3 (セクション 4.1.7) を見ると、...

スクロールバーを非表示にしながらもスクロール効果を維持する純粋な CSS (モバイルと PC)

携帯モバイル ページは Chrome および Safari とのみ互換性があればよいため、カスタム ...

MySQL データベース シェル import_table データ インポート

目次MySQL Shell import_table データのインポート1. import_tabl...