簡體   English   中英

使用子查詢和MAX值上的左連接加速mysql查詢

[英]Speed up a mysql query with a left join on a subquery and MAX value

情況就是這樣: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

為了使這個子查詢更快:

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)上添加索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM