为了更有效地导航大型文档集合,您可以根据集合中文档中的一个或多个字段创建索引。本节介绍如何索引集合。
集合索引是虚拟列上的普通 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');
要基于集合中的文档创建索引,您需要创建一个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
: (对于 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
不能
false
在IndexField
条目中设置该字段。
这是一个基于多个字段创建索引的示例:
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。
中的options
和srid
字段IndexField
只有在
type
设置为时才会出现GEOJSON
。如果存在,它们将用作
ST_GeomFromGeoJSON()
将GEOJSON
数据转换为 MySQL 本机
GEOMETRY
值时的参数。
文档字段支持以下数据类型。type
在字段中
使用时,类型名称不区分大小写
。
对于 MySQL 8.0.17 及之后的版本,X DevAPI 支持通过将description 中
的 booleanarray
字段
设置为 来创建基于数组字段的索引
。例如,要在
数组字段上创建索引:
IndexField
true
emails
collection.createIndex("emails_idx", //
{fields: [{"field": "$.emails", "type":"CHAR(128)", "array": true}]});
以下限制适用于基于数组创建索引: