Создание индекса по свойству JSON
Для больших таблиц запросы к полям JSON могут быть медленными. Для повышения производительности вы можете создать индекс по значению, извлеченному из столбца JSON. В MariaDB это достигается путем добавления виртуального столбца на основе поля JSON, а затем создания индекса на этом виртуальном столбце.
На этом этапе вы создадите виртуальный столбец для свойства price и затем проиндексируете его для ускорения запросов, основанных на цене.
Сначала добавьте виртуальный столбец, который извлекает цену из данных JSON:
ALTER TABLE products ADD COLUMN price_virtual INT AS (CAST(JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS SIGNED)) STORED;
Эта команда добавляет виртуальный столбец с именем price_virtual, который автоматически вычисляет и сохраняет значение цены из данных JSON.
Теперь создайте индекс на этом виртуальном столбце:
CREATE INDEX idx_product_price ON products (price_virtual);
Этот подход позволяет MariaDB эффективно искать строки по числовой цене, используя индексированный виртуальный столбец.
Чтобы подтвердить создание индекса, используйте команду SHOW INDEXES.
SHOW INDEXES FROM products;
Вывод перечислит все индексы в таблице products, включая ваш новый idx_product_price.
+----------+------------+-------------------+...
| Table | Non_unique | Key_name |...
+----------+------------+-------------------+...
| products | 0 | PRIMARY |...
| products | 1 | idx_product_price |...
+----------+------------+-------------------+...
Самое важное — увидеть, использует ли оптимизатор индекс. Вы можете проверить это с помощью команды EXPLAIN.
EXPLAIN SELECT product_name FROM products WHERE price_virtual > 1200;
В выводе EXPLAIN посмотрите на столбцы possible_keys и key. Вы должны увидеть там idx_product_price, что подтверждает, что MariaDB использует ваш индекс для эффективного выполнения запроса.
Вы также можете выполнять запросы, используя исходное выражение JSON, и оптимизатор MariaDB все равно сможет использовать индекс на виртуальном столбце:
EXPLAIN SELECT product_name FROM products WHERE CAST(JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS SIGNED) > 1200;
Вы успешно создали виртуальный столбец и проиндексировали его для оптимизации запросов к свойствам JSON.
Теперь вы можете выйти из оболочки MySQL.
exit