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
这应该能让您更快地得到想要的结果。
我在 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
这应该能让您更快地得到想要的结果。