[英]Using filesort to order by price column in MySQL
我有一个查询,比这个查询要复杂一些(得到最便宜的价格),但这表示性能问题很好。 因此查询无法更改。
我尝试创建不同的索引来加快订购速度,但不走运。
需要什么索引才能使此1.4秒持久查询更快? 如果我删除ORDER BY,查询将持续0.05秒,但我需要进行排序。
询问
SELECT id AS pid
FROM prices pt
WHERE pt.id = (
SELECT pt2.id
FROM prices pt2
WHERE pt2.oid=pt.oid
ORDER BY pt2.price
LIMIT 1
)
说明
1 PRIMARY pt index NULL id_price 12 NULL 9144 Using where; Using index
2 DEPENDENT SUBQUERY pt2 ref oid,oid_price oid 4 oid 23 Using where; Using filesort
索引
PRIMARY PRIMARY 9144 id
price INDEX 703 price
oid INDEX 397 oid
id_price INDEX 9144 id,price,oid
oid_price INDEX 4572 oid,price
查询很少更改是非常罕见的。 没有看到原件,很难确定。 例如,您似乎正在尝试获取ID列表,其中这些ID是其“ oid”的最低价格。
您作为示例给出的查询可以很容易地重写为不需要相关的子查询。 相关子查询通常是性能问题的根源。
SELECT p.id
FROM (SELECT oid, MIN(price) AS minPrice FROM prices GROUP BY oid) AS mins
INNER JOIN prices AS p ON mins.oid = p.oid AND mins.minPrice = p.price
;
要快速进行上述查询,就可能需要有一个索引(oid,价格)。
注意:结果的唯一区别应该是,如果有多个条目的价格最小,则可以为同一个oid
值返回多个id
值; 而不是有效地随机选择价格最低的id
值之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.