DynamoDB是AWS推出的全托管键值对和文档数据库,支持自动扩缩容、低延迟读写等特性,被广泛应用于高并发业务场景。合理的模式选择和性能优化策略,能大幅提升数据库的读写效率,同时避免不必要的成本浪费。

DynamoDB两种核心模式介绍
预置容量模式
预置容量模式需要用户提前指定表需要的读写容量单位(RCU和WCU),数据库会按照设定的容量分配资源,适合负载相对稳定的业务场景。如果实际负载超过预置容量,请求会触发限流,返回ProvisionedThroughputExceededException错误。
预置容量模式下可以开启自动扩缩容功能,当负载达到阈值时自动调整预置容量,避免手动调整的滞后性。自动扩缩容的配置示例如下:
{
"AutoScalingRoleArn": "arn:aws:iam::123456789012:role/AutoScalingRole",
"TargetTrackingScalingPolicyConfiguration": {
"TargetValue": 70.0,
"PredefinedMetricSpecification": {
"PredefinedMetricType": "DynamoDBReadCapacityUtilization"
}
}
}
按需模式
按需模式不需要提前预置容量,数据库会根据实际的读写请求量自动分配资源,按实际使用的RCU和WCU计费,适合负载波动大、难以预测的业务场景。按需模式下默认支持更高的突发吞吐量,短时间内的流量峰值也能正常处理,不会触发限流。
写入性能优化方法
合理设计分区键
分区键的选择直接影响写入的并行度,要避免使用单一值作为分区键,否则会导致热点分区,写入性能大幅下降。建议选择取值分布均匀、基数高的字段作为分区键,比如用户ID、订单ID等。
批量写入操作
单次写入请求的延迟开销较高,使用批量写入可以减少请求次数,提升整体写入效率。DynamoDB的批量写入接口支持一次处理最多25个条目,总大小不超过16MB。批量写入的代码示例(Python SDK)如下:
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('user_table')
# 批量写入数据
with table.batch_writer() as batch:
for i in range(10):
batch.put_item(
Item={
'user_id': f'user_{i}',
'user_name': f'name_{i}',
'age': 20 + i
}
)
选择合适的写入模式
如果业务写入量稳定,选择预置容量模式并开启自动扩缩容,能获得更可控的成本和性能;如果写入量波动大,比如电商大促、突发活动场景,选择按需模式可以避免预置容量不足导致的限流,也无需为闲置容量付费。
查询性能优化方法
使用合适的索引
除了主键查询,非主键条件的查询需要创建二级索引。全局二级索引(GSI)可以跨分区查询,本地二级索引(LSI)只能在同一个分区键内查询,根据查询场景选择合适的索引类型,避免全表扫描。
创建全局二级索引的示例(AWS CLI)如下:
aws dynamodb update-table
--table-name user_table
--attribute-definitions AttributeName=age,AttributeType=N
--global-secondary-index-updates "Create={IndexName=age_index,KeySchema=[{AttributeName=age,KeyType=HASH}],Projection={ProjectionType=ALL},ProvisionedThroughput={ReadCapacityUnits=5,WriteCapacityUnits=5}}"
避免全表扫描
全表扫描会遍历所有分区的数据,性能差且消耗大量RCU,尽量通过主键或者索引查询数据。如果必须全表扫描,建议分段扫描,控制每次扫描的数据量,避免对线上业务造成影响。
查询模式适配
如果查询负载稳定,预置容量模式下可以为索引预置足够的RCU,保障查询延迟稳定;如果查询量波动大,按需模式可以自动应对流量变化,不需要手动调整索引的容量配置。
预置容量与按需模式的选择标准
可以通过以下几个维度判断选择哪种模式:
- 负载可预测性:负载稳定、可预测选预置容量,波动大、不可预测选按需模式
- 成本敏感度:长期稳定负载下预置容量成本更低,短期波动负载下按需模式成本更优
- 运维成本:预置容量需要关注容量使用率,按需模式几乎不需要运维调整
- 性能要求:预置容量可以保障固定的吞吐量,按需模式的突发吞吐量更高但长期稳定吞吐量不如预置容量
两种模式也支持互相切换,切换过程不会影响线上业务的正常运行,切换时的注意事项如下:
{
"TableName": "user_table",
"BillingMode": "PAY_PER_REQUEST" // 切换为按需模式,可选值为PROVISIONED或PAY_PER_REQUEST
}
常见优化误区
误区1:预置容量越高性能越好。过高的预置容量会造成资源浪费,建议结合自动扩缩容设置合理的预置值,保持容量利用率在60%-80%之间。
误区2:按需模式不需要做任何优化。按需模式虽然自动扩缩容,但分区键设计不合理、全表扫描等问题依然会导致性能下降,基础优化工作不能省略。
误区3:切换模式会影响业务。DynamoDB的模式切换是在线操作,不会中断读写请求,切换完成后新的计费规则立即生效。