繁体   English   中英

在MySQL中使用Filesort按价格列排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM