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