【发布时间】:2018-04-12 18:09:54
【问题描述】:
有大表(~1.6m 行),看起来像:
------------------------------------
| id | text | image_id | order |
------------------------------------
| 2 | random | 12 | 1 |
------------------------------------
| 3 | random | 12 | 2 |
------------------------------------
| 5 | random | 12 | 1 |
------------------------------------
| 6 | random | 12 | 2 |
------------------------------------
| 8 | random | 17 | 1 |
------------------------------------
| 9 | random | 17 | 1 |
------------------------------------
目标是:
------------------------------------
| id | text | image_id | order |
------------------------------------
| 2 | random | 12 | 1 |
------------------------------------
| 3 | random | 12 | 2 |
------------------------------------
| 8 | random | 17 | 1 |
------------------------------------
多行id不同但其他数据相同,所以每个订单号只需要保留一行(111222333444需要为1234)。
此查询适用于小表:
DELETE n1 FROM table n1, table n2 WHERE image_id = 12 AND n1.id > n2.id AND n1.order = n2.order
但是对于大表查询时间太长,所以接收超时。
数据库后端是 Laravel 和 PHP,我们使用块来查询这些表。
基本目标是根据 image_id 爬取大表并删除重复项,因此对于每个 image_id,我们得到的行的顺序列如下:1、3、4、5、6、7、8 等。
【问题讨论】:
-
删除查询需要在 (image_id, id, order) 列上建立索引