Я пытаюсь применить индекс, который ускорит один из самых медленных запросов в моем приложении:
SELECT * FROM orders WHERE product_id IN (1, 2, 3, 4) AND user_id = 5678;
У меня есть индекс product_id
, user_id
и пара (product_id, user_id)
. Однако сервер не использует ни один из этих индексов:
+----+-------------+------- +------+-------------------------------------------------------------------------------------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+-------------------------------------------------------------------------------------------+------+---------+------+------+-------------+
| 1 | SIMPLE | orders | ALL | index_orders_on_product_id,index_orders_on_user_id,index_orders_on_product_id_and_user_id | NULL | NULL | NULL | 6 | Using where |
+----+-------------+--------+------+-------------------------------------------------------------------------------------------+------+---------+------+------+-------------+
(В разработке только 6 строк, так что в любом случае, но в производстве около 400 тыс. Строк, поэтому выполнение занимает около 0,25 с, и этот запрос выполняется довольно часто.)
Как мне избежать простого WHERE
здесь? Я полагаю, что мог бы отправить запрос для каждого product_id
, который, вероятно, был бы быстрее, чем эта версия, но число продуктов могло бы быть очень большим, поэтому, если это выполнимо в одном запросе, это было бы значительно предпочтительнее. Этот запрос генерируется Rails, поэтому я немного ограничен в том, насколько я могу реструктурировать сам запрос. Спасибо!