mysql - 尝试删除 1000 个日志条目,但如果只有 999 个可用,我会超时
问题描述
所以这是我到目前为止所尝试的:
DELETE FROM Log WHERE LogTime < DATE_SUB(NOW(), INTERVAL 30 DAY) ORDER BY ID LIMIT 1000
我试图一次从表 Log 中删除 1000 行,以便可以以受控方式完成,并且不会占用 mysql 服务器的所有资源。
现在来解决问题。当有数千行要删除时,它可以完美地工作。似乎因为我按 ID 排序,这是一个 auto_increment 主键,它将从头开始并根据需要进行。LogTime 也在增加,因此第一行具有最旧的时间戳。
现在的问题是,如果我只有 999 行应该根据 LogTime < DATE_SUB(NOW(), INTERVAL 30 DAY) 检查删除。然后它将在整个表中搜索最后 1 行。
有没有办法告诉mysql只删除,直到它没有找到更多匹配项,按照它搜索的顺序?
解决方案
LogTime
在您的列上放置一个索引。然后ORDER BY ID
从您的 DELETE 查询中删除。然后删除 1000(或更少)行的批次应该是有效的。
如果您必须保证您的删除批次按照严格的 ID 顺序进行,您仍然需要我建议的索引。您的查询会很好。
但是,如果您的批量删除方案不需要维护 ID 顺序,这是一个更好的选择,尤其是在表处于活动状态时。如果您重新运行 DELETE 查询直到它删除 0 行,您不必担心严格的 ID 顺序。
较小的批次(50 或 100 个)将占用您的桌子更短的时间,从而减少桌子其他用户的延迟。在子句中使用单个索引列WHERE
可以减少死锁的机会。
推荐阅读
- angular - 没有 HTTPS 的 IdentityServer4 不起作用
- php - 数组中的 if 语句
- postgresql - 从 PostgreSQL 中的 JSON 数组索引和查询 int 值
- java - PostgreSQL 驱动程序问题
- javascript - 正则表达式,包含 3 个或更多字符,最少 1 个减号,最多 3 个数字
- linux - 如何将完整数据库导入 Linux 并检查导入进度?
- ajax - Explorer 11 中的 AJAX
- java - 带有数据绑定的房间注释处理器;导致找不到符号类 BR
- python - Flake8 插件安装
- netlogo - NetLogo - 单方面交换附近海龟的价值