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() возвращает ошибку, если индекс с таким же именем уже существует или если определение индекса имеет неправильный формат. Параметр имени является обязательным и должен быть допустимым именем индекса, принятым SQL-запросом.
Для удаления существующего индекса используйте метод collection.dropIndex(string name). Это удалит индекс с указанным именем, и операция успешно выполнится без ошибок, если индекса с указанным именем не существует.
Индексы коллекции хранятся как виртуальные столбцы. Для проверки созданного индекса используйте соответствующий запрос. Например, для использования этого SQL из MySQL Shell:
session.runSql('SHOW INDEX FROM mySchema.myCollection');Определение индекса
Для создания индекса, основанного на документах в коллекции, необходимо создать JSON-документ IndexDefinition. Этот раздел объясняет допустимые поля, которые можно использовать в таком JSON-документе для определения индекса.
Для определения поля документа для индексирования коллекции тип этого поля должен быть одинаковым во всей коллекции. Другими словами, тип должен быть согласован. JSON-документ, используемый для определения индекса, например {fields: [{field:
'$.username', type: 'TEXT'}]}, может содержать следующее:
-
fields: массив из как минимум одного объектаIndexField, каждый из которых описывает поле JSON-документа, которое нужно включить в индекс.Описание одного
IndexFieldсостоит из следующих полей:field: строка с полным путем к члену или полю документа, которое необходимо индексировать.type: строка одного из поддерживаемых типов столбцов для сопоставления поля (см. Типы данных полей). Для числовых типов необязательное ключевое словоUNSIGNEDможет следовать. Для типаTEXTнеобходимо определить длину, которую следует учитывать при индексировании (длину префикса).required: необязательный булевый тип, который должен быть установлен в значениеtrue, если поле должно существовать в документе. По умолчанию устанавливается в значениеfalseдля всех типов, кромеGEOJSON, для которого значение по умолчанию равноtrue.options: необязательное целое число, которое используется как специальный флаг при декодировании данныхGEOJSON(см. описание для деталей).srid: необязательное целое число, используемое в качестве значения srid при декодировании данныхGEOJSON(см. описание для деталей).-
array: необязательный булевый тип, который устанавливается в значениеtrue, если поле содержит массивы. Значение по умолчанию равноfalse. Для получения подробностей см. Индексирование полей массивов.ВажноДля MySQL 8.0.16 и более ранних версий поля, являющиеся JSON-массивами, не поддерживаются в индексе; указание поля, содержащего данные массива, не генерирует ошибку от сервера, но индекс не работает правильно.
type: необязательная строка, определяющая тип индекса. Значение должно быть одним изINDEXилиSPATIAL. По умолчанию этоINDEX, и его можно опустить.
Включение любых других полей в JSON-документ IndexDefinition или IndexField, которые не описаны выше, приводит к ошибке collection.createIndex().
Если тип индекса не указан или установлен как INDEX, то результирующий индекс создается так же, как при выполнении . Если тип индекса установлен как SPATIAL, то созданный индекс такой же, как при выполнении с ключевым словом 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'}]})Значения индексируемых полей преобразуются из JSON в тип, указанный в описании IndexField, с использованием стандартных преобразований типов MySQL (см. ), за исключением типа GEOJSON, для которого используется функция для преобразования. Это означает, что при использовании числового типа в описании IndexField фактическое значение поля, которое не является числовым, преобразуется в 0.
Поля options и srid в описании IndexField могут присутствовать только в том случае, если type установлено в значение GEOJSON. Если они присутствуют, они используются в качестве параметров для при преобразовании данных GEOJSON в собственные значения MySQL.
Типы данных полей
Ниже приведены поддерживаемые типы данных для полей документов. Имена типов игнорируют регистр при использовании в поле type.
[UNSIGNED]
[UNSIGNED]
[UNSIGNED]
[UNSIGNED]
[UNSIGNED]
[UNSIGNED]
[UNSIGNED]
[UNSIGNED]
[UNSIGNED]
[UNSIGNED]
[UNSIGNED]
(дополнительные параметры: options, srid)
Индексирование полей массивов
X DevAPI поддерживает создание индексов, основанных на полях массивов, установив булево поле array в описании IndexField в значение true. Например, для создания индекса на поле массива emails:
collection.createIndex("emails_idx", //
{fields: [{"field": "$.emails", "type":"CHAR(128)", "array": true}]});Следующие ограничения применяются к созданию индексов, основанных на массивах:
Для каждого индекса только одно индексируемое поле может быть
array-
Типы данных, для которых может быть создан индекс по массивам:
Числовые типы:
[UNSIGNED]( не поддерживается)Типы с фиксированной точкой: (значения precision и scale обязательны)
Типы дат и времени: , , и
Строковые типы: и ; длина символов или байтов
nобязательна ( не поддерживается)
© 2025 Oracle
Licensed under the GPLv2 License.