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

推薦する

MySQL 数十億のデータのインポート、エクスポート、移行に関するメモ

最近はMySQLのメモをたくさん取っていますが、それは主に会社のOracleが比較的安定していてメン...

MySQLクエリのソートとページング関連

概要通常、データベース内のデータを直接表示することは望ましくないため、最後の 2 つのセクションでは...

MySQL Community Server 5.6.39 のインストール方法

この記事では、MySQLのダウンロードとインストールの詳細なチュートリアルを記載しています。具体的な...

MySQL INT型の完全な分析

序文: Integer は MySQL で最もよく使用されるフィールド型の 1 つで、通常は整数を格...

カルーセルカルーセルケースのJS実装

この記事の例では、カルーセルカルーセルを実装するためのJSの具体的なコードを参考までに共有しています...

MySQLインデックスの簡単な分析

データベース インデックスは、テーブル操作の速度を向上させることを目的としたデータ構造です。高速なラ...

MySQL デッドロック ルーチン: 一意のインデックスの下でのバッチ挿入順序の不一致

序文デッドロックの本質はリソースの競合です。バッチ挿入の順序が一貫していないと、デッドロックに陥りや...

Nginx 仮想ホスト (IP ベース) を構成する 3 つの方法の詳細な説明

Nginx は、IP ベースの仮想ホスト構成、ポート ベースの仮想ホスト構成、ドメイン名ベースの仮想...

PostgreSQL データベースにおける varchar、char、text の比較に関する簡単な説明

以下のように表示されます。名前説明する文字可変(n)、varchar(n)長さ制限あり、可変長文字(...

MySQL グリーンバージョン設定コードと 1067 エラーの詳細

MySQL グリーンバージョン設定コードと 1067 エラーMySQL エンコーディングを表示 &#...

フレックスレイアウトを使用してページレイアウトを簡単に実装するためのサンプルコード

では、早速コードを見てみましょう。 1. 上部、中央、下部のレイアウト: <!DOCTYPE ...

HTMLリンクを書くときは、HTTPリクエストを減らすためにサブフォルダに必ずスラッシュを追加してください。

サブフォルダーの末尾にスラッシュがない場合、2 つの HTTP リクエストが生成され、効率に影響しま...

Vue.js プロジェクトの開始方法

目次1. Node.jsとVue 2. ローカル開発環境でフロントエンドのVueプロジェクトを実行す...

MySQLマスタースレーブデータベース構築方法の詳細な説明

この記事では、MySQL マスター/スレーブ データベースの構築方法について説明します。ご参考までに...

Docker ベースの Selenium 分散環境の構築

1.画像をダウンロードするdocker pull selenium/hub docker pull ...