索引
インデックスは、列內(nèi)の特定の値を持つ行をすばやく検索するために使用されます。
インデックスを使用しない場(chǎng)合、MySQL は最初のレコードから開始して、関連する行が見つかるまでテーブル全體を読み取る必要があります。テーブルが大きいほど時(shí)間がかかります。テーブル內(nèi)のクエリ対象のカラムにインデックスがある場(chǎng)合、MySQL はすべてのデータを調(diào)べることなく、データ ファイルの中央を検索する段階にすぐに到達(dá)できます。
もちろん、インデックスの數(shù)が多すぎると、修正速度が遅くなります。変更されたデータを書き込むときは、インデックスも変更する必要があるためです。
インデックスは、クラスター化インデックスと非クラスター化インデックスに分けられます。クラスター化インデックスは、データ ストレージの物理的な場(chǎng)所に従って順序付けされます。ただし、非クラスター化インデックスは、複數(shù)行の取得の速度を向上させることができます。クラスター化インデックスは単一行の取得が非常に高速です。
1. 通常のインデックス
–インデックスを直接作成します
CREATE INDEX index_name ON table(column(length)) –修改表結(jié)構(gòu)的方式添加索引 ALTER TABLE table_name ADD INDEX index_name ON (column(length)) –創(chuàng)建表的時(shí)候同時(shí)創(chuàng)建索引 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. インデックスの値が異なる點(diǎn)を除き、通常のインデックスと似ています。列は必須ですただし、null 値は許可されます (主キーとは異なることに注意してください)。結(jié)合インデックスの場(chǎng)合、列の値の組み合わせは一意である必要があり、作成方法は通常のインデックスと同様です。
–創(chuàng)建唯一索引 CREATE UNIQUE INDEX indexName ON table(column(length)) –修改表結(jié)構(gòu) ALTER TABLE table_name ADD UNIQUE indexName ON (column(length)) –創(chuàng)建表的時(shí)候直接指定 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 を使用して後で追加されます。 ////より大きなデータ セットの場(chǎng)合は、FULLTEXT インデックスを使用せずにテーブルにデータを入力してインデックスを作成する方が、既存の FULLTEXT インデックスにデータを入力するよりも高速です。ただし、大容量のデータ テーブルの場(chǎng)合、フルテキスト インデックスの生成は非常に時(shí)間とハードディスクのスペースを消費(fèi)するプロセスであることに注意してください。
– テーブル作成時(shí)に全文インデックスを追加するのが適しています
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) );– テーブル構(gòu)造を変更して全文インデックスを追加します
ALTER TABLE article ADD FULLTEXT index_content(content)– インデックスを直接作成します
CREATE FULLTEXT INDEX index_content ON article(content)4. 単一列インデックス、複數(shù)列インデックス
複數(shù) 単一列インデックスのクエリ効果は、単一列インデックスの効果とは異なります。これは、クエリの実行時(shí)に MySQL が使用できるインデックスは 1 つだけであり、選択されるインデックスは 1 つだけであるためです。複數(shù)のインデックスから最も制限の厳しいインデックス。
5. 結(jié)合インデックス (一番左のプレフィックス)
一般的に使用される SQL クエリ文には多くの制限があるため、MySQL の効率をさらに絞るには、結(jié)合インデックスの確立を検討する必要があります。たとえば、上の表では、タイトルと時(shí)刻の結(jié)合インデックスが作成されます: ALTER TABLEarticle ADD INDEXindex_titme_time (title(50), time(10))。このような結(jié)合インデックスを確立することは、実際には、次の 2 つの結(jié)合インデックス セットを確立することと同じです:
–title、time
–title
なぜ time のような結(jié)合インデックスがないのですか?これは、MySQL 複合インデックスの「左端のプレフィックス」の結(jié)果です。簡単に理解すると、組み合わせは一番左のものから開始するだけです。次の SQL に示すように、これら 2 つの列を含むクエリだけが結(jié)合インデックスを使用するわけではありません。
– 上記のインデックスを使用します
SELECT * FROM article WHREE title='測(cè)試' AND time=1234567890; SELECT * FROM article WHREE utitle='測(cè)試';
– 上記のインデックスを使用しません
SELECT * FROM article WHREE time=1234567890;