我有一个比这个更复杂的查询(得到最便宜的价格),但这代表了性能问题。所以查询无法改变。
我尝试创建不同的索引,以便在没有运气的情况下加快订购速度。
需要什么索引才能更快地获得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
答案 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
值之一。