MySQL Как проиндексировать массив JSON?

#mysql #sql #json #indexing #query-optimization

#mysql #sql #json #индексирование #оптимизация запросов

Вопрос:

У меня есть поле JSON с одномерным массивом. На самом деле, в этом поле у меня есть список некоторых идентификаторов, вроде этого:

 [347470, 162063, 17315, 346852, 174776, 295865, 7833, 136813]
  

В своих запросах я ссылаюсь на это поле следующим образом:

 ... AND JSON_CONTAINS(`users_actions`, 174776)=0 
  

Мой вопрос таков: должен ли я создать индекс для этого поля, и если да, то какой именно индекс мне следует использовать?

Комментарии:

1. Вы имеете в виду вот так ?

2. Стоит отметить, что Postgres отлично справляется с этой задачей в столбцах ARRAY, , HSTORE и JSON . MySQL не так уж и много.

3. @tadman Я не думаю, что это применимо

4. Я не думаю, что есть способ проиндексировать это в MySQL. Вам было бы лучше нормализовать схему.

5. @tadman: согласен с Бармаром, этот метод работает для объектов JSON, а не для массивов.

Ответ №1:

Если вы используете самую последнюю версию MySQL (8.0.17 или выше), вы можете использовать многозначный индекс, который был разработан именно для этой цели:

Многозначный индекс — это вторичный индекс, определенный в столбце, в котором хранится массив значений.

[…]

Многозначные индексы предназначены для индексации JSON массивов.

[…]

Оптимизатор использует многозначный индекс для извлечения записей, когда в WHERE предложении указаны следующие функции: MEMBER OF() , JSON_CONTAINS() , JSON_OVERLAPS() .

Предполагая, что ваш массив json хранится в столбце myjs таблицы mytable , вы можете создать индекс следующим образом:

 CREATE INDEX myidx 
ON mytable ( (CAST(myjs AS UNSIGNED ARRAY)) );