优化子查询基于组的最后输入

时间:2017-11-29 14:44:05

标签: mysql subquery

我们的代码中有一个错误,它将错误的值缓存到last_order_id(expected_previous_order)列。我正确编写的查询找到了正确的最后一个订单ID但对我们的数据集来说太慢了。

我想将此数据选择到另一个表中,但我不能,因为查询需要的时间太长

我在这里用一个较小的数据集设置了一个简单的例子。原始表有大约170k行。

SQL Fiddle of my Example

在示例中:

  • original_artwork_id是这些行的分组方式。
  • order_id是当前行的订单ID
  • actual_previous_order是更正的最后订单ID
  • expected_previous_order是当前存储的最后一个订单ID。这是错误的值,因为它实际上没有引用最后的订单ID

Showing that the acutal_previous_order should correspond with the previous order_id

EXPLAIN结果

enter image description here

修改

每次重新排序时,都会在order_artwork表格中添加一个新条目,并引用original_artwork_idlast_order_id

当前数据集中对last_order_id的引用是错误的。

我需要更新所有记录以正确指出最后一个订单ID。

我这样做是为了找到每件艺术品并将其加入同一original_artwork_id的前一个条目。然后我可以从最后一个条目中提取order_id来更新当前条目last_order_id

使用相同的original_artwork_id或当前行original_artwork_id =前一行id

加入当前行之前创建的上一行的当前行

1 个答案:

答案 0 :(得分:0)

我发现创建的时间列不可靠。所以我决定只使用相同的original_artwork_id找到最后一个最高订单ID。

创建具有更正值的表

CREATE TABLE order_artwork_two AS 
   select 
      d1.id, 
      d1.order_id, 
      max(d2.order_id) last_order_id, 
      d1.original_artwork_id 
   from order_artwork d1
   left join order_artwork d2 
       ON d1.original_artwork_id = d2.original_artwork_id 
           and d1.order_id > d2.order_id 
   group by d1.original_artwork_id, d1.order_id;

为新表添加索引。否则更新会太慢

alter table order_artwork_two add primary KEY(id);

更新原始表格。

update order_artwork d1 
    left join order_artwork_two d2 on d2.id = d1.id
    set d1.last_order_id = d2.last_order_id;