使用filesort按MySQL中的price列排序

时间:2017-04-12 16:15:52

标签: mysql performance indexing filesort

我有一个比这个更复杂的查询(得到最便宜的价格),但这代表了性能问题。所以查询无法改变。

我尝试创建不同的索引,以便在没有运气的情况下加快订购速度。

需要什么索引才能更快地获得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

1 个答案:

答案 0 :(得分:0)

查询无法改变是非常罕见的;没有看到原作,很难肯定。例如,看起来您正在尝试获取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,price)的索引可能是使上述查询快速完成所需的全部内容。

注意:结果的唯一区别应该是,如果有多个价格最低的条目,则可以为相同的id值返回多个oid值;而不是有效地随机选择价格最低的id值之一。