我在mysql查询中使用OR
同时检查不同的值,我发现结果变得非常缓慢,在这里我也加入了两个表,我无法检查哪个需要很长时间。
在此查询:
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 :(得分: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
这三个查询(联合在一起)可以通过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
这可以让您更快地得到想要的结果。