Spec-Zone.ru › MySQL Connectors 1.0

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.
https://docs.oracle.com/cd/E17952_01/x-devapi-userguide-en/collection-indexing.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API