#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)) );