2012-07-31 91 views
0

这种情况:2个表,一个包含项目列表,另一个包含对这些项目进行的出价列表。现在我需要知道与实际价格的项目的细节。换句话说,如果已经进行了投标,我需要知道该项目的投标清单中的最高价值以获得当前价格。在有些情况下还会有适用于过滤下来的项目数量的其他规则的情况,但基本上可以归结为:加快子查询和MAX值左连接的mysql查询

SELECT i . * , IFNULL(GREATEST(b.`made_bid` , `start_bid`) , `start_bid`) AS current_price 
FROM `items` i 
LEFT JOIN (

SELECT `bid_list`.`item_id` , MAX(`made_bid`) AS made_bid 
FROM `bid_list` 
WHERE (

bid_status =1 
) 
GROUP BY `item_id` 
)b ON b.item_id = i.id 

这里是我的问题:这工作,但它的速度慢和减缓的越来越多的项目被输入到数据库中,越来越多的出价被制作出来,所以bid_list也在增长。

有没有更好的方法来编写此查询,或者最好的课程是将当前最高出价输入到项目表的额外列中,并在每次出价时更新它?不过某种程度上,这感觉不对,因为我会两次备份相同的信息。

任何与此有关的帮助将不胜感激。

PS,结果的解释道:

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 PRIMARY  i ALL  NULL NULL NULL NULL 839  
1 PRIMARY  <derived2> ALL  NULL NULL NULL NULL 507  
2 DERIVED  bid_list index status item_id  4 NULL 5726 Using where 

PPS的bid_list的指标:

PRIMARY BTREE Yes No id 5367 A  
item_id BTREE No No item_id 1073 A  
user_id BTREE No No user_id 894 A  
status BTREE No No bid_status 1 A YES 
made_bid_per_item BTREE No No status 5 A YES 
              item_id 1073 A 
              amount 5367 A 
+0

你有没有索引?你可以发布EXPLAIN的输出吗? – 2012-07-31 14:39:06

+0

当然,这里是 – Peter 2012-07-31 14:40:37

+0

你可以发布它的方式,它的可读性?尝试编辑您的问题。 – 2012-07-31 14:41:21

回答

2

对于这个子查询走快:

SELECT item_id, MAX(made_bid) AS made_bid 
FROM bid_list 
WHERE bid_status = 1 
GROUP BY item_id 

您应该添加(bid_status, item_id, made_bid)上的索引。

+0

好吧,这会大大加快速度。子查询本身的查询速度非常快,现在我的问题中的查询现在需要0.0061秒而不是0.0138秒 – Peter 2012-07-31 14:54:38

+0

这非常快!事实上,在......之前它已经很快了,你为什么需要它更快? – 2012-07-31 16:54:46

+0

嘿马克,因为在数据库中只有大约800个项目和6000个出价,并且随着更多记录的添加,我注意到逐渐变慢,所以我想现在优化查询。此外,正如我已经暗示,这是一个更大的查询的实际部分,我试图优化每个子查询,并决定是否可以在主查询上堆叠更多的子查询,因为还需要更多的信息。 – Peter 2012-08-01 06:36:05