0

これが状況です。1つはアイテムのリストを含み、もう1つはそれらのアイテムに対して行われた入札のリストを含む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が大きくなるため、速度が低下します。

このクエリを作成するためのより良い方法はありますか、それともここでの最善の方法は、現在の最高入札額をアイテムテーブルの追加の列に入力し、入札が行われるたびに更新することです。どういうわけか、同じ情報を2回ストックするので、それは間違っていると感じます。

これに関する助けをいただければ幸いです。

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
4

1 に答える 1

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)

于 2012-07-31T14:44:48.393 に答える