1

Я использую OR в запросе mysql для проверки разных значений в одно и то же время. Я обнаружил, что результаты идут очень медленно, и здесь я также присоединяюсь к двум таблицам, я не могу проверить, что занимает много времени.Mysql OR performance Issue

Запрос здесь:

select l.*, l.category as lid 
FROM listings AS l 
LEFT JOIN listprices as pr ON pr.product_id=l.id 
where (pr.price >= 100 AND pr.price <= 1000) 
    OR (pr.price >= 1001 AND pr.price <= 5000) 
OR (pr.price >= 5001 AND pr.price <= 10000) 
order by pr.price ASC 

запрос работает нормально, но результаты занимает слишком много времени. Если есть какая-либо другая альтернатива для быстрой работы. Я слышал ИЛИ занимал много времени, чтобы выполнить результаты.

+0

Боковое примечание. Вы должны поместить некоторые круглые скобки, чтобы отделить 'OR' от' AND', как этот 'id , где (pr.price> = 100 AND pr.price <= 1000) ИЛИ (pr.price> = 1001 И pr.price <= 5000) ИЛИ (pr.price> = 5001 И pr.price <= 10000) ' –

+0

Да, в скобках я забыл. –

+2

Подождите минуту ... это ваше текущее предложение 'WHERE'? В основном вы говорите, что хотите «pr.price» = 100' AND 'pr.price <= 10000'. –

ответ

2

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 

Это должно привести к тому, что вы хотите быстрее.

+0

Спасибо, Джонс. Работа быстро. –

+0

Добро пожаловать! –