MySQL インデックスの利点については、適切に設計されインデックスを使用する MySQL がランボルギーニである場合、設計されていないインデックスを使用する MySQL は人間の三輪車です。インデックスのないテーブルの場合、1 つのテーブル クエリに数十万のデータが含まれる可能性があり、これがボトルネックになります。通常、大規模な Web サイトでは 1 日に数十万、さらには数百万のデータが生成され、インデックスのないクエリは非常に遅くなります。 WordPress を例に挙げると、そのデータ テーブルの多くは頻繁にクエリされるフィールドにインデックスを追加します。たとえば、wp_comments テーブルには 5 つのフィールド用に設計された BTREE インデックスがあります。
簡単な例として、20 を超えるデータ ソースから 200 万個のデータがランダムに生成され、各データ ソースは平均して約 100,000 回繰り返されました。 simple、only 自動インクリメント ID、char 型、text 型、および int 型が含まれます。MyIASM エンジンを使用する場合、1 つのテーブルのサイズは 2G です。インデックスを追加せずにテストを開始します。
次の SQL ステートメントを実行します:
mysql> SELECT id,FROM_UNIXTIME(time) FROM article WHERE a.title='测试标题'
クエリに必要な時間は、結合クエリやその他の制約と組み合わせると非常に恐ろしいものとなり、データベースは膨大なメモリを消費し、フロントエンド プログラムの実行に影響を与えます。このとき、タイトルフィールドに BTREE インデックスを追加します:
mysql> ALTER TABLE article ADD INDEX index_article_title ON title(200);
上記のクエリステートメントを再度実行すると、比較が非常に明白です:
インデックスは特別なファイル (インデックスInnoDB データ テーブル上のテーブル (スペースのコンポーネント) には、データ テーブル内のすべてのレコードへの参照ポインターが含まれています。より一般的に言うと、データベース インデックスは本の巻頭にある目次のようなもので、データベース クエリを高速化できます。上記の SQL ステートメントでインデックスがない場合、データベースは 200 個のデータをすべて走査し、対応するインデックスで条件を満たすデータを選択し、インデックス内の条件を満たすオプションを直接検索します。 。 SQL ステートメントを「SELECT * FROMarticle WHERE id=2000000」に変更した場合、データベースが 200 万行のデータを順番に読み取った結果を返しますか、それともインデックス内で直接検索しますか?上の 2 つの図の明らかな時間の比較により、すでに答えが得られています (注: 一般に、データベースはデフォルトで主キーのインデックスを生成します)。
インデックスは、クラスター化インデックスと非クラスター化インデックスに分けられます。クラスター化インデックスは、データ ストレージの物理的な場所に従って順序付けされます。ただし、非クラスター化インデックスは、複数行の取得の速度を向上させることができます。クラスター化インデックスは単一行の取得が高速です。
1. 通常のインデックス
これには制限はありません。たとえば、上記のタイトル フィールドに対して作成されるインデックスは、MyIASM のデフォルトの BTREE タイプのインデックスです。ほとんどの場合に使用するインデックスも含まれます。
01 –直接创建索引 02 CREATE INDEX index_name ON table(column(length)) 03 –修改表结构的方式添加索引 04 ALTER TABLE table_name ADD INDEX index_name ON (column(length)) 05 –创建表的时候同时创建索引 06 CREATE TABLE `table` ( 07 `id` int(11) NOT NULL AUTO_INCREMENT , 08 `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 09 `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 10 `time` int(10) NULL DEFAULT NULL , 11 PRIMARY KEY (`id`), 12 INDEX index_name (title(length)) 13 ) 14 –删除索引 15 DROP INDEX index_name ON table
2. 一意のインデックス
は、インデックス列の値が一意である必要がある点を除き、通常のインデックスと似ていますが、null 値が許可されます (主キーとは異なることに注意してください)。結合インデックスの場合、列の値の組み合わせは一意である必要があり、作成方法は通常のインデックスと同様です。
01 –创建唯一索引 02 CREATE UNIQUE INDEX indexName ON table(column(length)) 03 –修改表结构 04 ALTER TABLE table_name ADD UNIQUE indexName ON (column(length)) 05 –创建表的时候直接指定 06 CREATE TABLE `table` ( 07 `id` int(11) NOT NULL AUTO_INCREMENT , 08 `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 09 `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 10 `time` int(10) NULL DEFAULT NULL , 11 PRIMARY KEY (`id`), 12 UNIQUE indexName (title(length)) 13 );
3. フルテキスト インデックス (FULLTEXT)
MySQL は、バージョン 3.23.23 以降、フルテキスト インデックス作成とフルテキスト検索をサポートしています。 CHAR、VARCHAR、または TEXT 列。TABLE ステートメントの一部として作成されるか、ALTER TABLE または CREATE INDEX を使用して後で追加されます。 ////より大きなデータ セットの場合は、FULLTEXT インデックスを使用せずにテーブルにデータを入力してインデックスを作成する方が、既存の FULLTEXT インデックスにデータを入力するよりも高速です。ただし、大容量のデータ テーブルの場合、フルテキスト インデックスの生成は非常に時間とハードディスクのスペースを消費するプロセスであることに注意してください。
01 –创建表的适合添加全文索引 02 CREATE TABLE `table` ( 03 `id` int(11) NOT NULL AUTO_INCREMENT , 04 `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 05 `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 06 `time` int(10) NULL DEFAULT NULL , 07 PRIMARY KEY (`id`), 08 FULLTEXT (content) 09 ); 10 –修改表结构添加全文索引 11 ALTER TABLE article ADD FULLTEXT index_content(content) 12 –直接创建索引 13 CREATE FULLTEXT INDEX index_content ON article(content)
4. 単一列インデックス、複数列インデックス
複数の単一列インデックスのクエリ効果は、単一の複数列インデックスの効果とは異なります。 1 つのインデックスを使用し、最も制限の厳しいインデックスを複数選択します。
5. 複合インデックス (一番左のプレフィックス)
一般的によく使われる SQL クエリ文にはさらに制限があるため、MySQL の効率をさらに引き出すには、複合インデックスの構築を検討する必要があります。たとえば、上の表では、タイトルと時刻の結合インデックスが作成されます: ALTER TABLEarticle ADD INDEXindex_titme_time (title(50), time(10))。このような結合インデックスを確立することは、実際には、次の 2 つの結合インデックス セットを確立することと同じです:
–title、time
–title
なぜ time のような結合インデックスがないのですか?これは、MySQL 複合インデックスの「左端のプレフィックス」の結果です。簡単に理解すると、組み合わせは左端から開始するだけです。次の SQL に示すように、これら 2 つの列を含むクエリだけがこの結合インデックスを使用するわけではありません:
1 –使用到上面的索引 2 SELECT * FROM article WHREE title='测试' AND time=1234567890; 3 SELECT * FROM article WHREE utitle='测试'; 4 –不使用上面的索引 5 SELECT * FROM article WHREE time=1234567890;
上記は、mysql インデックスの概要、mysql インデックス タイプと作成の詳細な紹介、その他の関連コンテンツです。PHP に注意してください。中国語のウェブサイト (www.php.cn)!