MySQL не очень хорошо обрабатывает OR-предложения. (Правильно, но медленно.) В вашем случае кажется, что наличие вашей последовательности предложений OR приводит к победе над использованием вашего индекса на listprices.price
. Это сделает вашу работу вонючей. Попробуем реорганизовать этот запрос, чтобы избежать этой последовательности предложений OR.
Обратите внимание, что у вас есть шаблон LEFT JOIN x ... WHERE x.column ...
в вашем запросе. Это преобразует ваш LEFT JOIN
в внутренний JOIN
.
Прежде всего, давайте сделаем подзапрос, чтобы получить список значений listprices.product_id
с соответствующими ценами. Это выглядит следующим образом:
SELECT price, product_id FROM listprices pr WHERE pr.price >= 100 AND pr.price <= 1000
UNION
SELECT price, product_id FROM listprices pr WHERE pr.price >= 1001 AND pr.price <= 5000
UNION
SELECT price, product_id FROM listprices pr WHERE pr.price >= 5001 AND pr.price <= 10000
Эти три запроса (unioned вместе) каждый из них может быть сделано очень быстро индексом соединения на price, product_id
. Было бы разумно протестировать этот запрос, чтобы убедиться, что он дает нужный результат.
Затем вы будете использовать этот запрос в качестве подзапроса; то есть, как если бы он сам был столом:
select l.*, l.category as lid
FROM listings AS l
JOIN (
SELECT price, product_id FROM listprices pr WHERE pr.price >= 100 AND pr.price <= 1000
UNION
SELECT price, product_id FROM listprices pr WHERE pr.price >= 1001 AND pr.price <= 5000
UNION
SELECT price, product_id FROM listprices pr WHERE pr.price >= 5001 AND pr.price <= 10000
) pr ON pr.product_id = l.id
order by pr.price ASC
Это должно привести к тому, что вы хотите быстрее.
Боковое примечание. Вы должны поместить некоторые круглые скобки, чтобы отделить 'OR' от' AND', как этот 'id , где (pr.price> = 100 AND pr.price <= 1000) ИЛИ (pr.price> = 1001 И pr.price <= 5000) ИЛИ (pr.price> = 5001 И pr.price <= 10000) ' –
Да, в скобках я забыл. –
Подождите минуту ... это ваше текущее предложение 'WHERE'? В основном вы говорите, что хотите «pr.price» = 100' AND 'pr.price <= 10000'. –