この記事は最初に掲載されました https://antoniopeng.com
インデックスとは
インデックスのMySQL公式定義:インデックス(インデックス)は、MySQLが効率的にデータを取得するのに役立つデータ構造です。したがって、インデックスは、基本的なデータ構造です。索引付けの目的は、クエリの効率を向上させることです。これは、辞書や本のカタログなどのフォームと比較できます。
単に、として理解することができる迅速なデータ構造の優れたシーケンスを見つけるの行。データに加えて、システムは、データベースを維持、特定のデータ構造アルゴリズムクエリ満たすために、何らかの方法でデータ構造にこれらのデータポイントを。このようにして、高度な検索アルゴリズムをインデックスであるこれらのデータ構造に実装できます。
一般に、インデックスが比較的大きい場合、それはすべてのメモリに格納することができないので、インデックスがする傾向がインデックスファイルのディスク上に格納された形。
特に明記されていない限り、通常言及されるインデックスはBツリーインデックスです。その中で、クラスター化インデックス、セカンダリインデックス、カバーインデックス、プレフィックスインデックス、一意のインデックスはすべて、デフォルトでBツリーを使用します。
コマンドができshow index from table_name
、インデックス例表を見ます
インデックスの利点と欠点
アドバンテージ
- 大学図書館の書誌索引と同様に、データ検索の効率を向上させ、データベースのIOコストを削減します。
- インデックス列でデータを並べ替え、データの並べ替えのコストを削減して、CPU消費を削減します。
短所
- インデックスは実際にはテーブルであり、テーブルは主キーとインデックスフィールドを保持し、エンティティテーブルのレコードをポイントするため、インデックス列もスペースを占有します
- インデックスによってクエリの効率は大幅に向上しますが、挿入、更新、削除などのテーブルの更新速度は低下します。テーブルを更新すると、MySQLはデータを保存するだけでなく、インデックスファイルが毎回更新するインデックス列フィールドも保存します。更新操作の後、対応するフィールドインデックスの情報が更新されます
- インデックス作成は、クエリの効率を向上させるための1つの要素にすぎません。MySQLに多数のデータテーブルがある場合、最適なインデックスを作成するか、クエリステートメントを最適化するために調査に時間をかける必要があります
インデックス分類
インデックスは主に次の3つのカテゴリに分類されます。
- 単一値インデックス:インデックスには単一の列のみが含まれ、テーブルには複数の単一値インデックスを含めることができます
- 一意のインデックス:インデックス列の値は一意である必要がありますが、null値は許可され、主キーは一意のインデックスです
- 複合インデックス:インデックスには複数の列が含まれます
インデックス構造は、次の4つのカテゴリに分類されます。
- BTREEインデックス
- ハッシュインデックス
- 全文索引
- R-Textインデックス
基本的な構文の使用法
インデックスを作成
通常のインデックスを作成する
CREATE INDEX index_name ON table_name (column_name(length))
テーブル構造を変更してインデックスを追加することもできます
ALTER TABLE table_name ADD INDEX index_name (column_name(length))
注:タイプがcharまたはvarcharのフィールドの場合、長さはフィールドの実際の長さよりも短くなることがあります。タイプがblobまたはテキストの場合は、長さを指定する必要があります
インデックスを作成するその他の方法
主キーインデックスを追加する
ALTER TABLE table_name ADD PRIMARY KEY (column_name)
一意のインデックスを追加する
ALTER TABLE table_name ADD UNIQUE (column_name)
全文索引を追加
ALTER TABLE table_name ADD FULLTEXT (column_name)
共通インデックスを追加
ALTER TABLE table_name ADD INDEX index_name (column_name)
複合インデックスを追加する
ALTER TABLE table_name ADD INDEX index_name (column_name_1, column_name_2, column_name_3)
インデックスを削除
DROP INDEX index_name ON table_name
インデックスを表示
SHOW INDEX FROM table_name
インデックスを作成する必要がある
- 主キーは自動的に一意のインデックスを作成します
- 頻繁としてクエリフィールド
- クエリ内の他のテーブルに関連付けられたフィールド:外部キー関係にはインデックスが作成されます
- 高い同時実行が低く作成する傾向にある複合インデックスを
- クエリの並べ替えフィールドの。ソートフィールドにインデックスでアクセスすると、ソート速度が大幅に向上します。
- クエリパケットフィールド
インデックスを作成する必要はありません
- テーブル内のレコードが少なすぎる(データが少なすぎる、MySQLはそれ自体で処理できる)
- テーブルを頻繁に追加、削除、変更する
- 国籍、性別など、データが重複して均等に分散しているフィールド
- 頻繁に更新されるフィールドはインデックス作成に適していません
- Where条件で使用されていないフィールドは、インデックス作成にも適していません