Go Aurora vs DynamoDB延迟不符合预期
我想得到一些数字来证明我的阅读,DynamoDB键值存储比关系数据库(MySQL、PostgreSQL、Aurora)具有更好的读取性能。所以我决定比较DynamoDB和AWS Aurora(它是AWS网站的a/c——“比标准MySQL数据库快五倍,比标准PostgreSQL数据库快三倍”)的读取延迟 步骤1:在Aurora中创建了一个具有以下模式的表,并向该表中添加了102万条记录Go Aurora vs DynamoDB延迟不符合预期,go,amazon-dynamodb,latency,aws-sdk-go,amazon-aurora,Go,Amazon Dynamodb,Latency,Aws Sdk Go,Amazon Aurora,我想得到一些数字来证明我的阅读,DynamoDB键值存储比关系数据库(MySQL、PostgreSQL、Aurora)具有更好的读取性能。所以我决定比较DynamoDB和AWS Aurora(它是AWS网站的a/c——“比标准MySQL数据库快五倍,比标准PostgreSQL数据库快三倍”)的读取延迟 步骤1:在Aurora中创建了一个具有以下模式的表,并向该表中添加了102万条记录 Table gift_log ( gift_uuid BINARY(16) NO
Table gift_log (
gift_uuid BINARY(16) NOT NULL,
user_uuid BINARY(16) NOT NULL,
parent_uuid BINARY(16),
operation_time TIMESTAMP,
operation VARCHAR(20) NOT NULL,
gift_type VARCHAR(20) NOT NULL,
parent_type VARCHAR(20),
relation_type VARCHAR(20),
PRIMARY KEY (gift_uuid)
);
使用Golang客户端,该客户端使用数据库/sql包的MySQL驱动程序来查询表
步骤2;已创建具有以下属性的DynamoDB表。向表中添加了100万项。
没有使用任何排序键。所有查询都使用分区键
Table: GiftLog {
gift_uuid Binary (Partition Key)
user_uuid Binary
operation_time Number,
operation String,
gift_type String,
parent_type String
}
使用使用AWS Go SDK查询DynamoDB表的Golang客户端
极光
startTime := time.Now().UnixNano()
rows, err := db.Query("SELECT * FROM gift_log WHERE gift_uuid=?", giftIDsToRead[i])
endTimt := time.Now().UnixNano()
发电机
queryInput := &dynamodb.QueryInput{
TableName: aws.String(tableName),
KeyConditions: map[string]*dynamodb.Condition{
"GiftUUID": {
ComparisonOperator: aws.String("EQ"),
AttributeValueList: []*dynamodb.AttributeValue{
{
B: giftIDsToRead[i],
},
},
},
},
}
startTime := time.Now().UnixNano()
resp, err := svc.Query(queryInput)
endTime := time.Now().UnixNano()
极光潜伏期:543.89 DynamoDB潜伏期:2934.96 usec
这些数字似乎不正确。我不是在比较苹果吗?你没有显示计时结果。。。但我得说你是在拿苹果和桔子做比较。如果您知道DynamoDB项的主键,那么应该使用notquery() 使用GetItem(),您应该有“一位数毫秒”的响应时间不包括网络/HTTP延迟
最后一点很重要,但希望对Aurora的请求类似。您不显示计时结果。。。但我得说你是在拿苹果和桔子做比较。如果您知道DynamoDB项的主键,那么应该使用notquery() 使用GetItem(),您应该有“一位数毫秒”的响应时间不包括网络/HTTP延迟
最后一点很重要,但希望对Aurora的请求类似。我认为您遗漏了一些非常重要的要点
第一点很重要,因为这意味着为了从DynamoDB获取数据,您正在进行web请求,与更传统的数据库相比,web请求具有一定程度的开销。每个请求的开销可能在1-2毫秒左右。但是,在大多数应用程序的上下文中,只要应用程序具有良好的体系结构,并且不会发出大量不必要的请求,这一点就可以了 第二点很重要,因为如果您没有正确地看待它,您可能会测量异常值:这意味着您可能会看到一些无法代表典型性能的结果,并且可能会花费大量时间来掩盖事实真相。与其测量一个查询的性能,不如测量许多相同类型查询的性能,并计算一些统计数据,如:平均值和标准差;或(第50、90、99位为典型) 最后一点是使用DynamoDB与使用经典数据库引擎相比的真正动力。您看到的是最快乐的案例:一个(大概)包含几个项目的小表,其中您使用它的主键检索单个项目。DynamoDB实际上是关于随着数据的增长而发生的事情。当表中有1000项时,您希望在检索该项时具有与表中有100000000项时相同的性能。更复杂的查询会让事情变得更有趣 使用DynamoDB,在最简单的情况下,您可以用一点性能开销换取稳定性
但是DynamoDB不是万能药!在某些情况下,关系数据库总是优于DynamoDB 我认为你遗漏了几个非常重要的要点
第一点很重要,因为这意味着为了从DynamoDB获取数据,您正在进行web请求,与更传统的数据库相比,web请求具有一定程度的开销。每个请求的开销可能在1-2毫秒左右。但是,在大多数应用程序的上下文中,只要应用程序具有良好的体系结构,并且不会发出大量不必要的请求,这一点就可以了 第二点很重要,因为如果您没有正确地看待它,您可能会测量异常值:这意味着您可能会看到一些无法代表典型性能的结果,并且可能会花费大量时间来掩盖事实真相。与其测量一个查询的性能,不如测量许多相同类型查询的性能,并计算一些统计数据,如:平均值和标准差;或(第50、90、99位为典型) 最后一点是使用DynamoDB与使用经典数据库引擎相比的真正动力。您看到的是最快乐的案例:一个(大概)包含几个项目的小表,其中您使用它的主键检索单个项目。DynamoDB实际上是关于随着数据的增长而发生的事情。当表中有1000项时,您希望在检索该项时具有与表中有100000000项时相同的性能。更复杂的查询会让事情变得更有趣 使用DynamoDB,您可以在最简单的情况下用一点性能开销换取stabi