Mysql 或者性能问题

Mysql OR performance Issue

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

查询工作正常,但结果花费了太多时间。如果有任何其他选择可以快速获得。我听说 OR 花了很多时间来执行结果。

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 上的复合索引非常快地进行。明智的做法是测试此查询以确保它给出您想要的结果。

然后您将使用此查询作为子查询;也就是说,就好像它本身就是一个 table:

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

这应该能让您更快地得到想要的结果。