You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DynamoDB TTL删除速度跟不上过期标记速度,如何提升删除速率?

DynamoDB TTL删除速率优化方案

一、TTL原生速率限制说明

DynamoDB的TTL是后台异步低优先级任务,本身设计逻辑决定了其速率存在天然上限:

  • TTL删除操作不占用你配置的读写容量单元(RCU/WCU),但系统限制其删除速率最多不超过表预置写容量的10%;如果是按需计费模式,则不超过最近30分钟平均写入量的10%
  • 待删除的过期条目数量越多,TTL调度的资源会略有提升,但不会突破上述10%的上限,这就是你观测到待删条目到一定量级后速率不再上涨的原因

二、提升清理速率的可行方案

1. 临时调整表写容量(快速提升TTL速率)

如果你的表是预置容量模式,可以临时上调写容量WCU的配置,TTL的删除速率会同步按10%的比例上涨,等积压的过期数据清理完成后再调回原有配置即可,不会产生过多额外成本。

2. 手动批量删除(最可控,适合紧急清理)

如果要在48小时内完成清理,建议用Python脚本配合DynamoDB的扫描+批量删除接口主动清理过期数据,比等待TTL效率高得多。

Python3实现参考:

需要用到boto3库,核心逻辑是扫描出过期条目,用batch_write_item批量删除,注意控制速率避免超出表的WCU限制:

import boto3
import time
from datetime import datetime, timezone

# 配置参数
TABLE_NAME = "你的表名"
TTL_ATTRIBUTE = "你的TTL字段名"
# 30天前的时间戳,早于该时间的条目都会被清理
EXPIRE_BEFORE = int(datetime.now(timezone.utc).timestamp()) - 30*86400
BATCH_SIZE = 25  # batch_write_item单次最多支持25条操作
SCAN_PAGE_SIZE = 100

dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(TABLE_NAME)
client = boto3.client("dynamodb")

def delete_expired_items():
    last_evaluated_key = None
    deleted_count = 0

    while True:
        # 扫描过期条目
        scan_kwargs = {
            "FilterExpression": f"{TTL_ATTRIBUTE} < :expire_val",
            "ExpressionAttributeValues": {":expire_val": EXPIRE_BEFORE},
            "Limit": SCAN_PAGE_SIZE
        }
        if last_evaluated_key:
            scan_kwargs["ExclusiveStartKey"] = last_evaluated_key
        
        response = table.scan(**scan_kwargs)
        items = response.get("Items", [])
        if not items:
            break
        
        # 分批删除
        for i in range(0, len(items), BATCH_SIZE):
            batch = items[i:i+BATCH_SIZE]
            delete_requests = [
                # 替换为你表的实际主键字段
                {"DeleteRequest": {"Key": {"pk": item["pk"], "sk": item["sk"]}}}
                for item in batch
            ]
            client.batch_write_item(RequestItems={TABLE_NAME: delete_requests})
            deleted_count += len(batch)
            print(f"已删除{deleted_count}条过期数据")
            time.sleep(0.1)  # 按需调整休眠时间,避免打满WCU影响业务
        
        last_evaluated_key = response.get("LastEvaluatedKey")
        if not last_evaluated_key:
            break

if __name__ == "__main__":
    delete_expired_items()

注意:运行前需要替换代码中的表名、TTL字段名、主键字段,根据你的表的WCU配置调整批量大小和休眠间隔。

3. 长期优化建议

如果后续持续有大量过期数据需要清理,可以将数据按时间分片存储,比如按天/周创建不同的表,过期后直接删除整表,效率远高于逐行删除,也不需要依赖TTL机制。

内容的提问来源于stack exchange,提问作者UnclePhil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:45:07