与其仅对表执行删除,不如先尝试收集匹配的键,然后再执行DELETE JOIN
给您上面的示例查询
DELETE FROM my_table WHERE time_stored < 1234567890 LIMIT 100 ;
您可以将LIMIT排除在外。
假设您要删除超过31天的数据。
让我们以秒为单位计算31天(86400 X 31 = 2678400)
从密钥收集开始
接下来,索引键
然后,执行DELETE JOIN
最后,放下收集的键
这是算法
CREATE TABLE delete_keys SELECT id FROM my_table WHERE 1=2;
INSERT INTO delete_keys
SELECT id FROM
(
SELECT id FROM my_table
WHERE time_stored < (UNIX_TIMESTAMP() - 2678400)
ORDER BY time_stored
) A LIMIT 100;
ALTER TABLE delete_keys ADD PRIMARY KEY (id);
DELETE B.* FROM delete_keys
INNER JOIN my_table B USING (id);
DROP TABLE delete_keys;
如果密钥收集少于5分钟,则每5分钟运行一次此查询。
试试看 !!!
更新2012-02-27 16:55 EDT
这是一些应该加快密钥收集速度的事情。 添加以下索引:
ALTER TABLE my_table ADD INDEX time_stored_id_ndx (time_stored,id);
这将更好地支持填充delete_keys表的子查询,因为它提供了覆盖索引,以便仅从索引检索字段。
更新2012-02-27 16:59 EDT
由于您必须经常删除,因此您可能需要每两个月尝试一次
OPTIMIZE TABLE my_table;
所有这些烦人的小删除每5分钟删除两个月后,这将对表进行碎片整理