为了使大量文档集合更有效地导航,您可以根据集合中文档中找到的一个或多个字段创建索引。本节介绍如何为集合建立索引。
集合索引是虚拟列上的普通 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()
方法将失败并出现错误。名称参数是必需的,并且必须是 SQL 语句 CREATE INDEX
所接受的有效索引名称。
要删除现有索引,请使用 collection.dropIndex(string name)
方法。这将删除具有传递名称的索引,如果命名索引不存在,则操作将静默成功。
集合的索引存储为虚拟列。要验证创建的索引,请使用 SHOW INDEX
语句。例如,要在 MySQL Shell 中使用此 SQL
session.runSql('SHOW INDEX FROM mySchema.myCollection');
要根据集合中的文档创建索引,您需要创建一个 IndexDefinition
JSON 文档。本节说明您可以在此类 JSON 文档中使用哪些有效字段来定义索引。
要定义一个文档字段以根据集合建立索引,该字段的类型必须在整个集合中保持一致。换句话说,类型必须一致。用于定义索引的 JSON 文档,例如 {fields: [{field: '$.username', type: 'TEXT'}]}
,可以包含以下内容
-
fields
:至少包含一个IndexField
对象的数组,每个对象都描述了要包含在索引中的 JSON 文档字段。单个
IndexField
描述包含以下字段field
:包含要索引的文档成员或字段的完整文档路径的字符串type
:用于将字段映射到支持的列类型之一的字符串(请参阅 字段数据类型 )。对于数值类型,可以使用可选的UNSIGNED
关键字。对于TEXT
类型,您必须定义要用于索引的长度(前缀长度)。required
:一个可选的布尔值,如果该字段必须存在于文档中,则应将其设置为true
。对于所有类型,默认值为false
,但GEOJSON
除外,其默认值为true
。options
:一个可选的整数,用作解码GEOJSON
数据时的特殊选项标志(有关详细信息,请参阅ST_GeomFromGeoJSON()
的描述)。srid
:一个可选的整数,用作解码GEOJSON
数据时的 srid 值(有关详细信息,请参阅ST_GeomFromGeoJSON()
的描述)。-
array
:一个可选的布尔值,如果该字段包含数组,则将其设置为true
。默认值为false
。有关详细信息,请参阅 索引数组字段。重要对于 MySQL 8.0.16 及更早版本,索引中不支持作为 JSON 数组的字段;指定包含数组数据的字段不会从服务器生成错误,但索引无法正常工作。
type
:一个可选的字符串,用于定义索引的类型。值为INDEX
或SPATIAL
之一。默认值为INDEX
,可以省略。
在 IndexDefinition
或 IndexField
JSON 文档中包含任何未在上面描述的其他字段都会导致 collection.createIndex()
失败并出现错误。
如果未指定索引类型或设置为 INDEX
,则创建的索引与通过发出 CREATE INDEX
创建的索引相同。如果索引类型设置为 SPATIAL
,则创建的索引与通过发出 CREATE INDEX
(使用 SPATIAL
关键字)创建的索引相同,请参阅 空间索引优化 和 创建空间索引。例如
myCollection.createIndex('myIndex', //
{fields: [{field: '$.myGeoJsonField', type: 'GEOJSON', required: true}], type:'SPATIAL'})
当使用 SPATIAL
类型的索引时,required
字段不能在 IndexField
条目中设置为 false
。
这是一个根据多个字段创建索引的示例
myCollection.createIndex('myIndex', {fields: [{field: '$.myField', type: 'TEXT'}, //
{field: '$.myField2', type: 'TEXT(10)'}, {field: '$.myField3', type: 'INT'}]})
索引字段的值使用标准的 MySQL 类型转换(请参阅 表达式求值中的类型转换)从 JSON 转换为 IndexField
描述中指定的类型,但 GEOJSON
类型除外,它使用 ST_GeomFromGeoJSON()
函数进行转换。这意味着当在 IndexField
描述中使用数值类型时,实际字段值为非数值将被转换为 0。
IndexField
中的 options
和 srid
字段只能在 type
设置为 GEOJSON
时存在。如果存在,它们将用作 ST_GeomFromGeoJSON()
的参数,将 GEOJSON
数据转换为 MySQL 本机 GEOMETRY
值。
以下数据类型受文档字段支持。类型名称在 type
字段中使用时不区分大小写。
X DevAPI 支持通过在 IndexField
描述中将布尔 array
字段设置为 true
来创建基于数组字段的索引。例如,要根据 emails
数组字段创建索引
collection.createIndex("emails_idx", //
{fields: [{"field": "$.emails", "type":"CHAR(128)", "array": true}]});
基于数组创建索引时,以下限制适用