MyISAMとInnoDBの違いについてお話しましょう

MyISAMとInnoDBの違いについてお話しましょう

主な違いは次のとおりです。

1. MySQL はデフォルトで MyISAM を使用します。

2. MyISAM はトランザクションをサポートしていませんが、InnoDB はサポートしています。 InnoDB の AUTOCOMMIT はデフォルトでオンになっています。つまり、各 SQL ステートメントはデフォルトでトランザクションにカプセル化され、自動的にコミットされます。これは速度に影響するため、送信用のトランザクションを形成するには、begin と commit の間に複数の SQL ステートメントを配置するのが最適です。

3. InnoDB はデータ行のロックをサポートしていますが、MyISAM は行のロックをサポートしておらず、テーブル全体のロックのみをサポートしています。つまり、MyISAM の同じテーブルに対する読み取りロックと書き込みロックは相互に排他的です。MyISAM が読み取りと書き込みを同時に行う場合、待機キューに読み取り要求と書き込み要求の両方があると、読み取り要求が先に到着しても、デフォルトの書き込み要求の方が優先されます。そのため、MyISAM は、クエリ処理が長時間ブロックされるため、大量のクエリと変更が共存する状況には適していません。 MyISAM はテーブルをロックするため、時間のかかる読み取り操作によって他の書き込みプロセスが不足する可能性があります。

4. InnoDB は外部キーをサポートしますが、MyISAM はサポートしません。

5. InnoDB の主キー範囲は MyISAM の 2 倍まで広くなります。

6. InnoDB は全文インデックスをサポートしていませんが、MyISAM はサポートしています。フルテキスト インデックスとは、char、varchar、text の各単語 (ストップ ワードを除く) に対して逆インデックスを作成することを意味します。 MyISAM のフルテキスト インデックスは、中国語の単語分割をサポートしていないため、実際には役に立ちません。ユーザーは単語分割後にスペースを追加して、データ テーブルに書き込む必要があります。また、中国語の文字数が 4 文字未満の単語は、ストップ ワードのように無視されます。

7. MyISAM は GIS データをサポートしますが、InnoDB はサポートしません。つまり、MyISAM は、ポイント、ライン、ポリゴン、サーフェスなどの空間データ オブジェクトをサポートします。

8. where なしの Count(*) は、InnoDB よりも MyISAM を使用するとはるかに高速です。 MyISAM にはカウンターが組み込まれているため、count(*) のときにカウンターから直接読み取りますが、InnoDB ではテーブル全体をスキャンする必要があります。

そのため、InnoDB で count(*) を実行する場合は通常 where 句が伴い、where 句には主キー以外のインデックス列が含まれている必要があります。

ここで「主キーの外側」が強調されるのはなぜでしょうか? InnoDB では、プライマリ インデックスは生データと一緒に保存されますが、セカンダリ インデックスは別々に保存され、プライマリ キーを指すポインターが存在します。

したがって、count(*) のみの場合は、セカンダリ インデックスを使用してスキャンする方が高速ですが、プライマリ キーは主に、インデックスをスキャンして同時に生データを返す場合に役立ちます。

補足知識: MySQL における ENGINE=InnoDB と AUTO_INCREMENT はどういう意味ですか?

以下のように表示されます。

テーブル `hui_user` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ユーザーテーブルID',
 `username` varchar(50) NOT NULL COMMENT 'ユーザー名',
 `password` varchar(50) NOT NULL COMMENT 'ユーザーパスワード、MD5暗号化',
 `email` varchar(50) デフォルト NULL,
 `phone` varchar(20) デフォルト NULL,
 `question` varchar(100) DEFAULT NULL COMMENT 'パスワード回復の質問',
 `answer` varchar(100) DEFAULT NULL COMMENT 'パスワードの回答を取得する',
 `role` int(4) NOT NULL COMMENT 'ロール 0-管理者、1-一般ユーザー',
 `create_time` datetime NOT NULL COMMENT '作成時刻',
 `update_time` datetime NOT NULL COMMENT '最終更新時間',
 主キー (`id`)、
 ユニークキー `user_name_unique` (`username`) BTREE の使用
) ENGINE=InnoDB AUTO_INCREMENT=22 デフォルト CHARSET=utf8;

このSQL文には、

ENGINE=InnoDB AUTO_INCREMENT=22 デフォルトCHARSET=utf8;

しかし、最後の 3 つの項目が何のためにあるのかよくわかりません。

1. ENGINE=InnoDB はデフォルトのエンジンではないのですか?

2. AUTO_INCREMENT=22 は自動インクリメントではないですか?なぜ数字を設定するのですか?

3. my.ini で utf8 がすでに設定されていませんか?

ENGINE=InnoDB はデフォルトのエンジンではないのですか?

——はい、書かなくても大丈夫です、デフォルトが使われます。ここに書くのは、このテーブル作成文で何が使われているかがよくわかるし、テーブル作成時に書くのも良い習慣だからです。

AUTO_INCREMENT=22 は自動増分ではないのですか?なぜ数字を設定するのですか?

——これは自動増分です。ここで数値を設定すると、このステートメントが大きくなるにつれて 22 から自動増分することを意味します。

my.ini ではすでに utf8 が設定されていませんか?

——これはmy.iniで設定されていますが、MySQLの言語エンコーディングを設定します。ここで作成時に設定しないと文字化けした文字が出てしまいます。両者のスコープは異なります。フォームを作成すると、このcharsetがこのテーブルに適用されます。utf-8に設定されたMySQL履歴書データベースデータテーブルの文字セットを表します

MyISAMとInnoDBの違いに関する上記の記事は、編集者が皆さんと共有する内容のすべてです。参考になれば幸いです。また、123WORDPRESS.COMを応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL MyISAM デフォルト ストレージ エンジンの実装原則
  • MySQL InnoDBストレージエンジンについて簡単に説明します
  • MySQL ストレージ エンジン MyISAM と InnoDB の違いの概要

<<:  Tomcat をアンインストールして再インストールする方法 (画像とテキスト付き)

>>:  画像のフェードインとフェードアウト効果を実現する js

推薦する

Navicat For MySQL の使い方に関する簡単なチュートリアル

推薦する: Navicat for MySQL 15 登録とアクティベーションの詳細なチュートリアル...

アプレットにおけるwx.getUserProfileインターフェースの具体的な使用

最近、WeChatミニプログラムは、監査ミニプログラムのwx.loginおよびwx.getUserI...

Dockerでの接続例外中のエラーを解決する

Docker を初めて使い始めると、通常とは異なる問題に遭遇して、必然的に混乱してしまいます。大丈夫...

MySQL 分離列とプレフィックスインデックスの使用の概要

目次データ列を分離するプレフィックスインデックスとインデックスの選択性データ列を分離するMySQL ...

Linux での Makefile の書き方と使い方の詳細な説明

目次メイクファイルMakefile の命名とルールMakefile の仕組みMakefile変数Ma...

Reactは動的ポップアップウィンドウコンポーネントを実装します

UI コンポーネントを作成するときに、アニメーションを考慮しなければ、アニメーションを実現するのは非...

DockerにMinIOをインストールするための詳細な手順

目次1. docker環境が正常かどうかを確認する2. miniIOイメージをダウンロードする3. ...

MySQL で重複を削除するには、distinct または group by を使用する必要がありますか?

序文group by と distinctive のパフォーマンス比較について: インターネット上の...

ウェブデザインの概要

<br />1998年に最初の個人ページが誕生してから2008年の今日まで、デザイン業界...

Vueスロットの使用の詳細

目次1. スロットを使用する理由1.1 スロット1.2 コンポーネントのスロット1.3 例2. この...

MySQLでANDとORを組み合わせる問題を解決する

以下のように表示されます。 SELECT prod_name,prod_price FROM pro...

MySQL 学習チュートリアル クラスター化インデックス

クラスタリングは、実際には InnoDB データベース エンジンに関連しています。したがって、インデ...

2019 年に最も役立ち重要なオープンソース ツール トップ 10

Black Duck の 2017 年のオープンソース調査では、回答者の 77% がオープンソース...

jsはテーブルドラッグオプションを実装します

この記事の例では、テーブルドラッグオプションを実装するためのjsの具体的なコードを参考までに共有して...

Linux コマンドラインでメールを送信する 5 つの方法 (推奨)

シェル スクリプトで電子メールを作成する必要がある場合は、コマンド ラインから電子メールを送信する知...