使用子查询和MAX值上的左连接加速mysql查询

时间:2012-07-31 14:37:55

标签: mysql subquery

情况如下:2个表,一个包含项目列表,另一个包含对这些项目的出价列表。现在我需要知道具有实际价格的物品的细节。换句话说,如果已经出价,我需要知道此商品的出价列表中的最高价值才能获得当前价格。在某些情况下,会有其他规则适用于过滤项目数量,但基本上归结为:

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,EXPLAIN的结果:

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

1 个答案:

答案 0 :(得分: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)上添加索引。