Mysql OR性能问题

时间:2015-10-22 08:53:20

标签: mysql sql performance query-optimization query-performance

我在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

查询工作正常,但结果花费了太多时间。如果有任何其他选择加快。我听说过或者花了很多时间来执行结果。

1 个答案:

答案 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

这可以让您更快地得到想要的结果。