sql - 如何加速 "max()-searching"SQL 子查询

标签 sql subquery max

我创建了这个很好但运行缓慢的 SQL 语句来从链接到项目列表中的项目的价目表中搜索最高价格。已知的是项目itemnr:

SELECT i.ItemNr, i.ItemId, x.maxprice
  FROM itemlist i,
       pricelist p,
       (SELECT MAX (p2.price) AS maxprice, p2.ItemId
          FROM pricelist p2
         GROUP BY p2.ItemId) x
 WHERE i.ItemNr = 4711
   AND i.ItemId = p.ItemId
   AND i.ItemId = x.ItemId
   AND p.price = x.maxprice

项目列表包含大约 100000 个项目,价目表包含大约 1000000 个价格。这个语句真的很慢。我担心数据库服务器会为我搜索的每件商品搜索整个价目表。

我知道项目编号。但是我能否以某种方式搜索相应的 itemid 并将该 itemid“发送”到子查询?所以子查询可以快速找到这个商品的最高价???或者我的问题还有其他解决方案吗?

请帮忙。

最佳答案

我已将不需要的 JOIN 移除回 pricelist,因为您没有从中选择任何列:

select i.ItemNr, i.ItemId, x.maxprice
from itemlist i
inner join (
    select MAX(price) as maxprice, ItemId
    from pricelist
    group by ItemId
    ) x on i.ItemId = x.ItemId
where i.ItemNr = 4711

一些索引调整可能会有所帮助,一旦您提供了一些相关信息,我就可以提出一些建议。

关于sql - 如何加速 "max()-searching"SQL 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13179025/

相关文章:

mysql - 如何在 SQL 中查找一列上的元素以查找其他列中间隙不超过 3 个的值

SQLITE:无法解释的行为 - 比较适用于某些数字,不适用于其他数字

mysql - 使用 MAX 函数时返回多条记录?

scala - 更优雅的写法 if(list.nonEmpty) Some(list.max) else None?

c++ - 最大出现次数

sql - 用于根据同一个表中的 2 个条件获取计数的单个 SQL 查询

mysql - 从子查询接收的值列表中选择,可能为空

mysql - LEFT JOIN 与所有连接表的 id 列

mysql - 如何用 case 表达式解决这个子查询?

使用 RAND() 和 INNER JOIN 的 MySQL 子查询不返回任何行