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

推薦する

psdカット画像をdiv+css形式に変換する

PSD から div css へのウェブページ切り取り例ステップ 1: まず、すべてのタグの内側と外...

Vue+elementを使用してページ上部のタグを実装する方法の詳細な説明

目次1. ページレンダリング2. タグを切り替える3. タグを削除するこのようなタグはどのように記述...

Docker コンテナの uid と gid の詳細な理解

デフォルトでは、コンテナ内のプロセスは root ユーザー権限で実行され、この root ユーザーは...

Nginx+tomcat ロードバランシングクラスタの実装方法

実験環境は以下のとおりですここでは、4 台のサーバー (1 台の nginx、負荷用の 2 台の t...

mysql-5.7.21-winx64 無料インストール版のインストール - Windows チュートリアル詳細説明

1 ダウンロードアドレスは https://dev.mysql.com/downloads/mysq...

Docker プルタイムアウトの解決策

最近、Docker イメージのプルが非常に不安定です。遅く、タイムアウトすることがよくあります。 x...

h1、h2、h3タグを適切に使用する

Web ページを作成する過程では、<h1>、<h2>、<h3> ...

Nginx で 403 forbidden を解決するための完全な手順

ウェブページに403 Forbiddenと表示されるNginx (yum インストール ログは通常 ...

VMware を使用して PXE バッチ インストール サーバーをテストする詳細なプロセス

目次1. 準備1. 環境を整える2. インストール方法3. ネットワークカードの構成2. インストー...

MySQL マスターライブラリ binlog (master-log) とスレーブライブラリ relay-log 間のコードの詳細な説明

メインライブラリのバイナリログ: # 2420 で #170809 17:16:20 サーバー ID...

Linux での Docker のインストールと展開の例

以下の記事を読んだ後、プロジェクトをサーバーにデプロイできます。Tomcat、JDK、MySQL な...

nginx.conf のルートディレクトリ設定の詳細な説明

nginx.conf を構成するときには常に何らかの問題が発生します。ここでは、よくある問題とその解...

ユニアプリプロジェクトでのウォーターフォールレイアウトの実装

GitHubアドレス、気に入ったらスターを付けてくださいプラグインのプレビューチュートリアル1. プ...

docker を使用してシンプルな C/C++ プログラムをデプロイする方法

1. まずhello-world.cppファイルを作成しますプログラムコードは次のとおりです。 #i...

Javascript デザインパターン プロトタイプ モードの詳細

目次1. プロトタイプモード例1例2例3 2. オブザーバーパターン1. プロトタイプモードプロトタ...