Использование JSON_EXTRACT()
в предложении WHERE запроса SQL гарантирует, что он не сможет использовать индекс. Так что он собирается сделать сканирование таблицы, которое не более эффективно.
В общем, я рекомендую разработчикам, у которых в базе данных есть столбец JSON:
Вы можете извлечь часть JSON документа в списке SELECT:
SELECT JSON_EXTRACT(tour.orders, '..expr..') FROM ...
Но не делайте этого ни в одном другом пункте вашего запроса SQL. Ни в предложении WHERE, ни в выражении JOIN, ни в GROUP BY, ORDER BY, HAVING и т. Д. c. Есть много случаев, которые нельзя оптимизировать, и это делает ваши SQL запросы очень сложными, трудными для кодирования, трудными для чтения и сложными для обслуживания.
Вместо этого, если вы хотите сравнить с отдельными элементы массива JSON, вы должны хранить их в нормализованном порядке, по одному элементу на строку в дочерней таблице.
Например, у вас может быть таблица tour_orders
, где каждая строка имеет ссылку на tour.id
и один идентификатор заказа. Затем вы можете запросить его более читабельным способом:
query_data.where(order: orders)
Использование типа данных JSON в MySQL упрощает вставку большого количества данных, но усложняет многие типы запросов. Я рекомендую избегать типа данных JSON, если вам нужны выражения SQL для доступа к отдельным элементам JSON документа.