MySQL 8.0 リファレンスマニュアル


20.4.3.6 インデックスの作成および削除

インデックスは、特定のフィールド値を持つドキュメントをすばやく検索するために使用されます。 インデックスがない場合、MySQL は最初のドキュメントで始まり、コレクション全体を読み取って関連するフィールドを検索する必要があります。 コレクションが大きいほど、このコストは高くなります。 コレクションが大きく、特定のフィールドに対するクエリーが一般的な場合は、ドキュメント内の特定のフィールドに対するインデックスの作成を検討してください。

たとえば、移入フィールドのインデックスを使用すると、次のクエリーのパフォーマンスが向上します:

mysql-py> db.countryinfo.find("demographics.Population < 100")
...[output removed]
8 documents in set (0.00 sec)

create_index() メソッドは、使用するフィールドを指定する JSON ドキュメントで定義できるインデックスを作成します。 このセクションでは、インデックス付けの概要について説明します。 詳細は、Indexing Collections を参照してください。

一意でないインデックスの追加

一意でないインデックスを作成するには、インデックス名とインデックス情報を create_index() メソッドに渡します。 重複するインデックス名は禁止されています。

次の例では、demographics オブジェクトの Population フィールドに対して定義され、Integer 数値としてインデックス付けされた popul という名前のインデックスを指定します。 最後のパラメータは、フィールドに NOT NULL 制約が必要かどうかを示します。 値が false の場合、フィールドには NULL 値を含めることができます。 インデックス情報は、インデックスに含める 1 つ以上のフィールドの詳細を含む JSON ドキュメントです。 各フィールド定義には、フィールドへの完全なドキュメントパスを含め、フィールドのタイプを指定する必要があります。

mysql-py> db.countryinfo.createIndex("popul", {fields:
[{field: '$.demographics.Population', type: 'INTEGER'}]})

ここでは、整数の数値を使用してインデックスが作成されます。 GeoJSON データで使用するオプションなど、さらにオプションを使用できます。 デフォルトタイプの index が適切であるため、ここでは省略されているインデックスのタイプを指定することもできます。

一意インデックスの追加

一意のインデックスを作成するには、インデックス名、インデックス定義およびインデックスタイプ uniquecreate_index() メソッドに渡します。 この例は、国名 ("Name") に対して作成された一意のインデックスを示しています。これは、インデックス付けする countryinfo コレクションの別の共通フィールドです。 インデックスフィールドの説明で、"TEXT(40)"はインデックス付けする文字数を表し、"required": True はフィールドがドキュメントに存在する必要があることを指定します。

mysql-py> db.countryinfo.create_index("name",
{"fields": [{"field": "$.Name", "type": "TEXT(40)", "required": True}], "unique": True})
インデックスの削除

インデックスを削除するには、削除するインデックスの名前を drop_index() メソッドに渡します。 たとえば、次のように popul インデックスを削除できます:

mysql-py> db.countryinfo.drop_index("popul")
関連情報

関連キーワード:  インデックス, ドキュメント, フィールド, テーブル, 作成, 削除, コレクション, Shell, 定義, countryinfo