MYSQLストレージエンジン-MYISAMとINNODBの違い

mysqlのトランザクション

1.コンピューターデータベース内のトランザクション:コンピューター用語で
は、データベース内のさまざまなデータ項目アクセスして更新する可能性のあるプログラム実行ユニット(ユニット)を指します。2。リレーショナルデータベースでは、トランザクションはSQLステートメント、グループにすることができます。 SQLステートメントまたはプログラム全体の

  • トランザクション、途中でエラーがある限り、このトランザクションのすべての操作を元に戻す必要があります
  • Myisamはトランザクションをサポートしていませんが、innodbはトランザクションをサポートしています
mysqlのストレージエンジン
mysqlストレージエンジンには、MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDBCluster、ARCHIVE、CSV、BLACKHOLE、FEDERATEDなどが含まれます。これらの中でInnoDBとBDBはトランザクションセーフテーブルを提供し、その他のストレージエンジンは非トランザクションです。安全なテーブル。

mysqlバージョン

  • 5.1より前のデフォルトのストレージエンジンはmyisamでした。
  • 5.1以降のデフォルトのストレージエンジンはinnodbです。

1.myisamとinnodbの違い

MyISAM:
myisamはテーブルレベルのロックのみをサポートします。ユーザーがmyisamテーブルを操作すると、select、update、delete、およびinsertステートメントによってテーブルが自動的にロックされます。ロックされたテーブルが挿入の同時実行性を満たす場合は、テーブルの最後に挿入します。新しいデータ。lock tableコマンドを使用してテーブルをロックすることもできます。この操作は主にトランザクションを模倣できますが、多くの費用がかかり、通常は実験的なデモンストレーションでのみ使用されます。
InnoDB:
Innodbは、トランザクションと行レベルのロックをサポートします。これは、InnoDBの最大の機能です。
トランザクションのACIDプロパティ:原子性、一貫性、分離、耐久性。
並行トランザクションによって引き起こされるいくつかの問題:更新の喪失、ダーティ読み取り、繰り返し不可能な読み取り、ファントム読み取り
ここに画像の説明を挿入
mysqlのデフォルトのトランザクション分離レベルを確認してください「 'tx_isolation'のようなグローバル変数を表示します;」

mysql> show global variables like 'tx_isolation'; 
+--------------------+----------------------------+
| Variable_name | Value                        |
+--------------------+----------------------------+
| tx_isolation      | REPEATABLE-READ   |
+--------------------+----------------------------+
1 row in set (0.01 sec)
等同于 select @@global.tx_isolation
  • 現在のセッション分離レベルを設定します。セッショントランザクション分離レベルの繰り返し可能な読み取りを設定します。

  • システムの現在の分離レベルを設定します。グローバルトランザクション分離レベルの繰り返し読み取りを設定します
    。Innodbの行ロックモードには、共有ロック、排他ロック、意図的な共有ロック(テーブルロック)、意図的な排他ロック(テーブルロック)、ギャップロックがあります。

注:ステートメントがインデックスを使用しない場合、innodbは操作行を判別できません。今回は、インテンションロック、つまりテーブルロックが使用されます。
2.データベースファイルの違い

ここに画像の説明を挿入ここに画像の説明を挿入

3.インデックスの違い

1.自動成長について

  • myisamエンジンの自動成長列はインデックスである必要があります。複合インデックスの場合、自動成長は最初の列ではない可能性があります。前の列に従って並べ替えたり、増分したりできます。

  • innodbエンジンの自動拡張はインデックスである必要があります。複合インデックスの場合は、複合インデックスの最初の列でもある必要があります
    。2 主キーについて

  • Myisamでは、インデックスと主キーのないテーブルが存在できます。

  • myisamのインデックスは、保存された行のアドレスです。

  • innodbエンジンが主キーまたは空でない一意のインデックスを設定しない場合、6バイトの主キーが自動的に生成されます(ユーザーには表示されません)。

  • innodbのデータはメインインデックスの一部であり、追加のインデックスはメインインデックス
    3の値を保存します。count()関数について

  • myisamは、テーブルからcount(*)を選択した場合、テーブルの合計行数を保存します。値を直接取得します。

  • Innodbは、テーブル内の行の総数を保存しません。テーブルからselect count(*)を使用すると、テーブル全体をトラバースするため、多くのコストがかかりますが、wehre条件を追加すると、myisamとinnodbが処理します。同じ方法。
    4.フルテキストインデックス

  • myisamは、FULLTEXTタイプのフルテキストインデックスをサポートしています

  • InnodbはFULLTEXTタイプのフルテキストインデックス作成をサポートしていませんが、innodbはsphinxプラグインを使用してフルテキストインデックス作成をサポートでき、効果はより優れています。(Sphinxは、mysqlのさまざまなクエリを最適化できる複数の言語でAPIインターフェイスを提供するオープンソースソフトウェアです)
    5。テーブルから削除するときに
    このコマンドを使用すると、InnoDBはテーブルを再作成せず、データを1つずつ削除します。 innodbで大量のデータを含むテーブルをクリアする場合は、このコマンドを使用しないことをお勧めします。(テーブルの切り捨てを使用することをお勧めしますが、ユーザーにはこのテーブルを削除する権限が必要です)
    6。インデックスの保存場所

  • myisamのインデックスは、テーブル名+ .MYIファイルとして保存されます。

  • Innodbのインデックスとデータは、一緒に表スペースに保管されます。

総括する

1. MyISAMはトランザクションをサポートしていません。InnoDBはトランザクションタイプのストレージエンジンです。テーブルでトランザクションのサポートが必要な場合は、MyISAMを選択しないでください。

2. MyISAMはテーブルレベルのロックのみをサポートし、BDBはデフォルトでページレベルのロックとテーブルレベルのロックをページレベルのロックとしてサポートし、InnoDBはデフォルトで行レベルのロックとテーブルレベルのロックを行レベルのロックとしてサポートします
(テーブル-レベルロック:テーブル全体を直接ロックします。ロック期間中、他のプロセスはテーブルに書き込むことができません。書き込みロックが設定されている場合、他のプロセスは読み取ることができません。MyISAMはテーブルレベルのロックストレージエンジンであり、デッドロックの問題は発生しません)

3. MyISAMエンジンは外部キーをサポートしていません、InnoDBは外部キーをサポートしています

4. MyISAMエンジンのテーブルは、多数の同時読み取りおよび書き込みが多いと破損することがよくあります。

5. MyISAMには、count()クエリに対してより多くの利点があります

6. InnoDBは、大量のデータを処理するときに最大のパフォーマンスを発揮するように設計されています。そのCPU効率は、他のディスクベースのリレーショナルデータベースエンジンでは比類のないものです。

7. MyISAMは全文索引付け(FULLTEXT)をサポートしていますが、InnoDBはそれをサポートしていません

8. MyISAMエンジンテーブルのクエリ、更新、および挿入の効率は、InnoDBの効率よりも高くなっています。

テスト

テスト方法1:10個のクエリを連続して送信し、テーブルレコードの総数:380,000、時間単位

ここに画像の説明を挿入
a。データ量が数百万でトランザクション処理がない場合は、MyISAMを使用するのが最善の選択
です。b。InnoDBテーブルのサイズが大きく、MyISAMを使用するとハードディスク領域を大幅に節約できます。

テスト2:データ読み取りパフォーマンステスト。毎回1000レコードをランダムに読み取り、繰り返し読み取ります

ここに画像の説明を挿入
MyISAMの読み取りパフォーマンスは非常に恐ろしく、パフォーマンスのギャップは3倍であることがわかります。

テスト3:2つのスレッドが同時に書き込み、2つのスレッドが同時に読み取ります。

ここに画像の説明を挿入
要約すると、Innodb挿入のパフォーマンスは、書き込みが多く読み取りが少ないアプリケーションでより安定しており、同時条件下でも基本的に変更できません。より高速な読み取り速度が必要なアプリケーションの場合は、MyISAMを選択してください。

テスト4:データ挿入パフォーマンステスト。ここでは、innodb_flush_log_at_trx_commitパラメーターのオンとオフをテストしました。各テストは40秒間実行されます。表の数値は、実際の挿入数です。

ここに画像の説明を挿入
一般的に言って、MyISAMのパフォーマンスは優れています。挿入テスト中に、システムリソースを監視したところ、MyISAMが占めるシステムリソースは非常に少ないことがわかりましたが、Innodbは高いディスクを占めるため、トランザクション制御がさらに必要になるはずです。記録されたログ

おすすめ

転載: blog.csdn.net/weixin_45942735/article/details/104568969