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つずつ上下にスライドさせる機能を実装します

推薦する

Ubuntu 18.04 で apt-get ソースを変更する方法

apt-get を使用してインストールすると、非常に遅くなります。国内のソースを変更すると、この問題...

MySQL テーブル作成外部キー エラーの解決方法

データベーステーブルA: テーブル task_desc_tab を作成します ( id INT(11...

MySQL 5.7.17 のインストールと使用方法のグラフィックチュートリアル

MySQL は、スウェーデンの会社 MySQL AB によって開発され、現在は Oracle が所有...

ボタンをクリックした後のCSS読み込み効果を実現する

自社製品にクリック後1~2秒待機時間があるボタン(確認メールを送信する)があるため、クリック後の1~...

ie8/ie9/ie10/ie11 chrome firefox を区別するための CSS コード

ウェブサイトの互換性のデバッグは本当に面倒です。今日のウェブサイト デザイナーは、以前よりもはるかに...

JavaScript 戦略パターンを使用してフォームを検証する方法

目次概要戦略パターンを使用しないフォーム検証戦略パターンを使用して最適化する戦略パターンの利点要約す...

HTML テーブルの境界線を設定する際のヒント

HTML を初めて使用する多くの人にとって、テーブル <table> は最もよく使用され...

MySQL で大量のデータ (数千万) を素早く削除するためのいくつかの実用的なソリューションの詳細な説明

著者は最近、仕事でパフォーマンスのボトルネックの問題に遭遇しました。MySQL テーブルには毎日約 ...

Nginx の構成と HTTP 実装コード分析との互換性

OpenSSL を使用して SSL キーと CSR ファイルを生成するHTTPS を設定するには、秘...

MySQL テーブルスペースの断片化の概念と関連する問題の解決策

目次背景表領域の断片化とは何ですか?表領域の断片化を確認する方法表スペースの断片化問題を解決する方法...

Dockerがsudo操作を使用する必要がある問題を解決する

手順は以下のとおりです1. dockerグループを作成する: sudo groupadd docke...

Windows7 での Mysql5.7 my.ini ファイルの読み込みパスとデータの場所の変更方法

更新: MySQL の公式 Web サイトにアクセスして MySQL インストーラーをインストールし...

MySQLが数十億のトラフィックをサポートする方法

目次1 マスター・スレーブの読み取り・書き込み分離1.1 コア2 マスタースレーブレプリケーション2...

HTML テーブル タグ チュートリアル (31): セルの幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、セルの幅と高さはコンテンツに応じて自動的に調整されますが、セルの幅と高さを手動で設定...

MySQL の暗黙的な型変換によって発生するインデックス障害の解決策

目次質問再生暗黙的な変換要約する参照する質問仕事中、1 つの SQL クエリ ステートメントのみを実...