索引
インデックスは、列内の特定の値を持つ行をすばやく検索するために使用されます。
インデックスを使用しない場合、MySQL は最初のレコードから開始して、関連する行が見つかるまでテーブル全体を読み取る必要があります。テーブルが大きいほど時間がかかります。テーブル内のクエリ対象のカラムにインデックスがある場合、MySQL はすべてのデータを調べることなく、データ ファイルの中央を検索する段階にすぐに到達できます。
もちろん、インデックスの数が多すぎると、修正速度が遅くなります。変更されたデータを書き込むときは、インデックスも変更する必要があるためです。
インデックスは、クラスター化インデックスと非クラスター化インデックスに分けられます。クラスター化インデックスは、データ ストレージの物理的な場所に従って順序付けされます。ただし、非クラスター化インデックスは、複数行の取得の速度を向上させることができます。クラスター化インデックスは単一行の取得が非常に高速です。
1. 通常のインデックス
–インデックスを直接作成します
CREATE INDEX index_name ON table(column(length)) –修改表结构的方式添加索引 ALTER TABLE table_name ADD INDEX index_name ON (column(length)) –创建表的时候同时创建索引 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX index_name (title(length)) )
–インデックスを削除します
DROP INDEX index_name ON table2. インデックスの値が異なる点を除き、通常のインデックスと似ています。列は必須ですただし、null 値は許可されます (主キーとは異なることに注意してください)。結合インデックスの場合、列の値の組み合わせは一意である必要があり、作成方法は通常のインデックスと同様です。
–创建唯一索引 CREATE UNIQUE INDEX indexName ON table(column(length)) –修改表结构 ALTER TABLE table_name ADD UNIQUE indexName ON (column(length)) –创建表的时候直接指定 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), UNIQUE indexName (title(length)) );
3. フルテキスト インデックス (FULLTEXT)
MySQL は、バージョン 3.23.23 以降、フルテキスト インデックスとフルテキスト検索をサポートしています。 CHAR、VARCHAR、または TEXT 列。TABLE ステートメントの一部として作成されるか、ALTER TABLE または CREATE INDEX を使用して後で追加されます。 ////より大きなデータ セットの場合は、FULLTEXT インデックスを使用せずにテーブルにデータを入力してインデックスを作成する方が、既存の FULLTEXT インデックスにデータを入力するよりも高速です。ただし、大容量のデータ テーブルの場合、フルテキスト インデックスの生成は非常に時間とハードディスクのスペースを消費するプロセスであることに注意してください。
– テーブル作成時に全文インデックスを追加するのが適しています
CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), FULLTEXT (content) );– テーブル構造を変更して全文インデックスを追加します
ALTER TABLE article ADD FULLTEXT index_content(content)– インデックスを直接作成します
CREATE FULLTEXT INDEX index_content ON article(content)4. 単一列インデックス、複数列インデックス
複数 単一列インデックスのクエリ効果は、単一列インデックスの効果とは異なります。これは、クエリの実行時に MySQL が使用できるインデックスは 1 つだけであり、選択されるインデックスは 1 つだけであるためです。複数のインデックスから最も制限の厳しいインデックス。
5. 結合インデックス (一番左のプレフィックス)
一般的に使用される SQL クエリ文には多くの制限があるため、MySQL の効率をさらに絞るには、結合インデックスの確立を検討する必要があります。たとえば、上の表では、タイトルと時刻の結合インデックスが作成されます: ALTER TABLEarticle ADD INDEXindex_titme_time (title(50), time(10))。このような結合インデックスを確立することは、実際には、次の 2 つの結合インデックス セットを確立することと同じです:
–title、time
–title
なぜ time のような結合インデックスがないのですか?これは、MySQL 複合インデックスの「左端のプレフィックス」の結果です。簡単に理解すると、組み合わせは一番左のものから開始するだけです。次の SQL に示すように、これら 2 つの列を含むクエリだけが結合インデックスを使用するわけではありません。
– 上記のインデックスを使用します
SELECT * FROM article WHREE title='测试' AND time=1234567890; SELECT * FROM article WHREE utitle='测试';
– 上記のインデックスを使用しません
SELECT * FROM article WHREE time=1234567890;