情况是这样的: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 增长,它的速度很慢并且变慢。
是否有更好的方法来编写此查询,或者最好的方法是将当前最高出价输入到 items 表的额外列中,并在每次出价时更新它?但不知何故,这感觉不对,因为我会存储两次相同的信息。
对此的任何帮助将不胜感激。
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