1.はじめに
インデックスは、書籍のカタログと同様の特別なデータ構造であり、データベースのクエリ効率を大幅に向上させることができます。インデックスがない場合は、テーブル内のすべてのレコードをスキャンして、データをクエリするときの条件を満たすレコードを見つける必要があります。この種のフルテーブルスキャンクエリの効率は非常に低くなります。
2.タイプ
インデックスタイプ | 説明 |
---|---|
通常のインデックス | 最も基本的なインデックスは、制限なしで、クエリを高速化するだけです |
一意のインデックス | インデックス列の値は一意である必要がありますが、null値は許可されます |
プライマリキーインデックス | null値を許可しない特別な一意のインデックス。通常、プライマリキーインデックスは、テーブルの作成時に自動的に作成されます。 |
複合インデックス | 2つ以上の列のインデックスは、複合インデックスと呼ばれます。 |
フルテキストインデックス | テキストコンテンツの単語セグメンテーションインデックス |
3.使用する
#创建普通索引
create index indexName on tableName(field(length));
#创建唯一索引
create unique index indexName on tableName(field(length));
#创建复合索引
create index indexName on tableName(field1, field2, …,fieldN);
#删除索引
drop index indexName on tableName;
#查看索引
show index from tableName;
4.複合インデックスの先頭の列の特性
MySQLでは、複合インデックス(name、salary、dept)を作成する場合、3つのインデックス(name、salary、dept)、(name、salary)、および(name)を作成するのと同じです。これは複合インデックスの先頭の列機能と呼ばれるため、複合インデックスを作成するときは、クエリ条件として最も一般的に使用される列を左端に配置してからデクリメントする必要があります。
#未使用索引
select * from employee where salary = 8800;
select * from employee where dept = '部门A';
select * from employee where salary = 8800 and dept = '部门A';
#使用索引
select * from employee where name = 'liufeng';
select * from employee where name = 'liufeng' and salary = 8800;
select * from employee where name = 'liufeng' and salary = 8800 and dept = '部门A';
5.カバーリングインデックス
カバーリングインデックスは、インデックスカバレッジとも呼ばれます。つまり、選択したデータ列は、データ行を読み取らずにインデックスからのみ取得できます。つまり、インデックスをスキャンするだけでクエリ結果を取得できます。クエリがカバーインデックスを使用する場合、クエリアナライザの説明の追加の列に「インデックスの使用」が表示されます。
カバーするインデックスを使用すると、データテーブルをスキャンする代わりに、インデックスから必要なデータを取得するだけで済みます。
多くの場合、インデックスのボリュームはデータテーブルのボリュームよりもはるかに小さいため、インデックスの読み取りのみが高速になり、データアクセスの量が大幅に削減されます。
MySQLのクエリオプティマイザは、クエリを実行する前に、すべてのクエリ列をカバーできるインデックスがあるかどうかを判断します。
すべてのタイプのインデックスをカバーインデックスとして使用できるわけではありません。カバーインデックスは、インデックス列の値を格納する必要があります。ハッシュインデックス、空間インデックス、フルテキストインデックスなどは、実際にはインデックス列の値を格納しません。