目前将我们的表移动到仅附加模型以通过避免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查询可以,最好在一个或两个查询中如上所述清理表格?
由于
答案 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分钟的行。