X DevAPI 用户指南  / 第 4 章使用集合  /  4.4 索引集合

4.4 索引集合

为了更有效地导航大型文档集合,您可以根据集合中文档中的一个或多个字段创建索引。本节介绍如何索引集合。

创建索引

集合索引是虚拟列上的普通 MySQL 索引,从集合中的文档中提取数据。因为 MySQL 不能直接索引 JSON 值,所以要启用集合索引,您需要提供一个 JSON 文档来指定索引要使用的文档字段。您将定义索引的 JSON 文档作为 IndexDefinition参数传递给该 方法。这个通用示例(实际语法可能因不同的编程语言而异)显示了如何基于字段创建强制整数类型索引: Collection.createIndex(name, IndexDefinition)count

myCollection.createIndex("count", {fields:[{"field": "$.count", "type":"INT", required:true}]});

此示例显示如何基于文本字段创建索引:在本例中为邮政编码。对于文本字段,您必须根据 MySQL 服务器的要求为索引指定前缀长度:

myCollection.createIndex("zip", {fields: [{field: "$.zip", type: "TEXT(10)"}]})

有关索引的格式 和支持的字段类型的 信息, 请参阅定义索引。IndexDefinition

Collection.createIndex()如果同名索引已存在或索引定义格式不正确,则 该方法会失败并出现错误。name 参数是必需的,并且必须是 SQL 语句接受的有效索引名称CREATE INDEX

要删除现有索引,请使用该 collection.dropIndex(string name)方法。这将删除具有传递名称的索引,如果指定的索引不存在,操作将自动成功。

集合的索引存储为虚拟列。要验证创建的索引,请使用该SHOW INDEX语句。例如,从 MySQL Shell 使用此 SQL:

session.runSql('SHOW INDEX FROM mySchema.myCollection');

定义索引

要基于集合中的文档创建索引,您需要创建一个IndexDefinitionJSON 文档。本节介绍可在此类 JSON 文档中用于定义索引的有效字段。

要定义一个文档字段来索引一个集合,该字段的类型必须在整个集合中是统一的。换句话说,类型必须是一致的。用于定义索引的 JSON 文档(例如{fields: [{field: '$.username', type: 'TEXT'}]})可以包含以下内容:

  • fields:至少包含一个 IndexField对象的数组,每个对象描述一个要包含在索引中的 JSON 文档字段。

    单个IndexField描述由以下字段组成:

    • field: 一个字符串,包含要索引的文档成员或字段的完整文档路径

    • type:用于将字段映射到的受支持列类型之一的字符串(请参阅 字段数据类型 )。对于数字类型,可选 UNSIGNED关键字可以跟在后面。对于 TEXT类型,您必须定义考虑索引的长度(前缀长度)。

    • requiredtrue:一个可选的布尔值,如果该字段需要存在于文档中,则应将其设置为。默认 false为所有类型 GEOJSON,但默认为 true.

    • options: 一个可选的整数,用作解码 GEOJSON数据时的特殊选项标志(详见说明 ST_GeomFromGeoJSON())。

    • sridGEOJSON:一个可选的整数,在解码数据 时用作 srid 值 (ST_GeomFromGeoJSON()有关详细信息,请参见说明)。

    • array: (对于 MySQL 8.0.17 及更高版本)一个可选的布尔值, true如果字段包含数组则设置为。默认值为false。有关详细信息,请参阅 索引数组字段

      重要的

      对于 MySQL 8.0.16 及更早版本,索引中不支持 JSON 数组字段;指定包含数组数据的字段不会从服务器生成错误,但索引无法正常运行。

  • type:定义索引类型的可选字符串。值为INDEX或 之一SPATIAL。默认为 INDEX并且可以省略。

IndexDefinition在 JSON 文档中包含以上 IndexField未描述 的任何其他字段 会导致collection.createIndex()失败并出现错误。

如果未指定索引类型或将其设置为, INDEX则生成的索引的创建方式与通过发出创建索引的方式相同 CREATE INDEX。如果索引类型设置为,SPATIAL则创建的索引 CREATE INDEX与使用 SPATIAL关键字发出时创建的索引相同,请参阅 空间索引优化创建空间索引。例如:

myCollection.createIndex('myIndex', //
{fields: [{field: '$.myGeoJsonField', type: 'GEOJSON', required: true}], type:'SPATIAL'})
重要的

使用SPATIAL索引类型时, required不能 falseIndexField 条目中设置该字段。

这是一个基于多个字段创建索引的示例:

myCollection.createIndex('myIndex', {fields: [{field: '$.myField', type: 'TEXT'}, //
{field: '$.myField2', type: 'TEXT(10)'}, {field: '$.myField3', type: 'INT'}]})

IndexField索引字段的值使用标准 MySQL 类型转换(请参阅 表达式评估中的类型 转换)从 JSON 转换为描述中指定的类型,类型除外 GEOJSON,它使用 ST_GeomFromGeoJSON()函数进行转换。这意味着当在描述中使用数字类型时 IndexField,非数字的实际字段值将转换为 0。

中的optionssrid 字段IndexField只有在 type设置为时才会出现GEOJSON。如果存在,它们将用作 ST_GeomFromGeoJSON()GEOJSON数据转换为 MySQL 本机 GEOMETRY值时的参数。

字段数据类型

文档字段支持以下数据类型。type在字段中 使用时,类型名称不区分大小写 。

索引数组字段

对于 MySQL 8.0.17 及之后的版本,X DevAPI 支持通过将description 中 的 booleanarray字段 设置为 来创建基于数组字段的索引 。例如,要在 数组字段上创建索引: IndexFieldtrueemails

collection.createIndex("emails_idx", //
    {fields: [{"field": "$.emails", "type":"CHAR(128)", "array": true}]});

以下限制适用于基于数组创建索引:

  • 对于每个索引,只有一个索引字段可以是 array

  • 可以为其创建数组索引的数据类型: