MySQL Append-Only Model - 使用DELETE清理查询

时间:2013-02-26 20:14:49

标签: mysql sql rdms

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

所有行都带有时间戳,使用MAX(时间戳)选择最新的行。 虽然经过一段时间后表格会充满旧的无关数据,但我们可以写一个简单的

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查询可以,最好在一个或两个查询中如上所述清理表格?

由于

1 个答案:

答案 0 :(得分: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 Fiddle