Go Aurora vs DynamoDB延迟不符合预期

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

我想得到一些数字来证明我的阅读,DynamoDB键值存储比关系数据库(MySQL、PostgreSQL、Aurora)具有更好的读取性能。所以我决定比较DynamoDB和AWS Aurora(它是AWS网站的a/c——“比标准MySQL数据库快五倍,比标准PostgreSQL数据库快三倍”)的读取延迟

步骤1:在Aurora中创建了一个具有以下模式的表,并向该表中添加了102万条记录

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是一个“数据库即服务”,而Aurora是一个更传统的数据库
  • 无论何时进行性能基准测试或任何类型的测试,您都不能只运行一个测试:您需要执行大量测试,然后计算一个统计数据,例如平均值,或者更好的是计算一个最高百分位数(例如第99个百分位数)
  • 当您需要“任何规模的可预测性能”时,DynamoDB将大放异彩

  • 第一点很重要,因为这意味着为了从DynamoDB获取数据,您正在进行web请求,与更传统的数据库相比,web请求具有一定程度的开销。每个请求的开销可能在1-2毫秒左右。但是,在大多数应用程序的上下文中,只要应用程序具有良好的体系结构,并且不会发出大量不必要的请求,这一点就可以了

    第二点很重要,因为如果您没有正确地看待它,您可能会测量异常值:这意味着您可能会看到一些无法代表典型性能的结果,并且可能会花费大量时间来掩盖事实真相。与其测量一个查询的性能,不如测量许多相同类型查询的性能,并计算一些统计数据,如:平均值和标准差;或(第50、90、99位为典型)

    最后一点是使用DynamoDB与使用经典数据库引擎相比的真正动力。您看到的是最快乐的案例:一个(大概)包含几个项目的小表,其中您使用它的主键检索单个项目。DynamoDB实际上是关于随着数据的增长而发生的事情。当表中有1000项时,您希望在检索该项时具有与表中有100000000项时相同的性能。更复杂的查询会让事情变得更有趣

    使用DynamoDB,在最简单的情况下,您可以用一点性能开销换取稳定性


    但是DynamoDB不是万能药!在某些情况下,关系数据库总是优于DynamoDB

    我认为你遗漏了几个非常重要的要点

  • DynamoDB是一个“数据库即服务”,而Aurora是一个更传统的数据库
  • 无论何时进行性能基准测试或任何类型的测试,您都不能只运行一个测试:您需要执行大量测试,然后计算一个统计数据,例如平均值,或者更好的是计算一个最高百分位数(例如第99个百分位数)
  • 当您需要“任何规模的可预测性能”时,DynamoDB将大放异彩

  • 第一点很重要,因为这意味着为了从DynamoDB获取数据,您正在进行web请求,与更传统的数据库相比,web请求具有一定程度的开销。每个请求的开销可能在1-2毫秒左右。但是,在大多数应用程序的上下文中,只要应用程序具有良好的体系结构,并且不会发出大量不必要的请求,这一点就可以了

    第二点很重要,因为如果您没有正确地看待它,您可能会测量异常值:这意味着您可能会看到一些无法代表典型性能的结果,并且可能会花费大量时间来掩盖事实真相。与其测量一个查询的性能,不如测量许多相同类型查询的性能,并计算一些统计数据,如:平均值和标准差;或(第50、90、99位为典型)

    最后一点是使用DynamoDB与使用经典数据库引擎相比的真正动力。您看到的是最快乐的案例:一个(大概)包含几个项目的小表,其中您使用它的主键检索单个项目。DynamoDB实际上是关于随着数据的增长而发生的事情。当表中有1000项时,您希望在检索该项时具有与表中有100000000项时相同的性能。更复杂的查询会让事情变得更有趣

    使用DynamoDB,您可以在最简单的情况下用一点性能开销换取stabi