0

目前将我们的表移动到仅附加模型,以通过避免 UPDATE 和 DELETE 来提高写入性能,并使用 SELECT 的 memcached 前端。

所有行都带有时间戳,使用 MAX(timestamp) 选择最新的行。这很好用,虽然一段时间后表格会充满旧的不相关数据,我们可以编写一个简单的

DELETE FROM table WHERE timestamp < XXXX 

尽管这将删除在过去 XX 时间内可能尚未更新的行,因此从表中完全删除该 ID 而不仅仅是旧行。

下面提供了一个非常简单的示例模式和数据来演示

---------------------------
| id        |   INT       |
| name      |   VARCHAR   |
| timestamp |   TIMESTAMP |
---------------------------

初始数据

-------------------------------------------
| id        |   name       |  timestamp   |
-------------------------------------------
| 1         |   Trevor     |            1 |
| 2         |   Mike       |            1 |
-------------------------------------------

如果用户名被更新,一行将被追加,而不是更新,用户的新名称。

-------------------------------------------
| id        |   name       |  timestamp   |
-------------------------------------------
| 1         |   Trevor     |            1 |
| 2         |   Mike       |            1 |
| 1         |   Trev       |           60 |
-------------------------------------------

使用简单的 DELETE 查询删除超过 60 秒的行(实际情况更像是一个小时甚至一天)将按预期删除第 1 行的 Trevor,但它也会删除 Mike 的唯一记录。

-------------------------------------------
| id        |   name       |  timestamp   |
-------------------------------------------
| 1         |   Trev       |           60 |
-------------------------------------------

我们需要它只删除早于 XX 的不同 ID 行,因此即使 Mike 没有更新他的名字并且他的时间戳早于 XX 时间,我们也会留下两个用户。

-------------------------------------------
| id        |   name       |  timestamp   |
-------------------------------------------
| 2         |   Mike       |            1 |
| 1         |   Trev       |           60 |
-------------------------------------------

我们可以遍历每个 ID,获取最新的时间戳,然后删除所有早于该时间戳的行,但是随着表获得更多用户,此过程将花费更长的时间。

是否有任何 SQL 查询可以,最好是在一个或两个查询中清理表,如上所述?

谢谢

4

1 回答 1

1

我不是 MySQL 专家,但我相信这个查询应该可以解决问题:

DELETE t1 FROM
  table1 AS t1, table1 AS t2
WHERE 
  t1.id = t2.id
AND 
  t1.timestamp < t2.timestamp;

您可以将这 60 分钟添加到 t1.timestamp,这样它只会删除超过 60 分钟的行。

SQL小提琴

于 2013-02-26T20:43:07.113 回答