1

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

Step1 : 在 Aurora 中使用以下 Schema 创建一个表,并向该表添加 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)
);

使用了使用 MySQL 驱动的数据库/sql 包查询表的 Golang 客户端。

步骤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 微秒

这些数字似乎不对。我不是在比较苹果和苹果吗?

4

2 回答 2

6

你没有显示计时结果......但我会说你正在将苹果与橙子进行比较。如果您知道 DynamoDB 项目的主键,则应该使用GetItem()而不是 Query()。

使用 GetItem(),您应该有“个位数毫秒”的响应时间;不包括网络/HTTP 延迟

最后一点很重要,但希望对 Aurora 的请求类似。

于 2019-04-08T21:06:55.210 回答
1

我认为你遗漏了一些非常重要的观点。

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

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

第二点很重要,因为如果您没有正确看待它,您可能会测量异常值:这意味着您可能会看到一些不代表典型性能的结果,并且可能会花费大量时间追逐红鲱鱼。不是测量一个查询的性能,而是测量许多相同类型查询的性能并计算一些统计数据,例如:平均值和标准差;或第N 个百分位数(典型值为 50、90、99)

最后一点确实是使用 DynamoDB 与经典数据库引擎的主要动机。您正在查看最快乐的案例:一张(大概)带有一些项目的小表,您正在使用它的主键检索单个项目。DynamoDB 真正关注的是随着数据随时间增长而发生的情况。您希望现在检索该项目时具有相同的性能,当您的表中有 1000 个项目时,当您的表中有 100,000,000 个项目时。更复杂的查询确实会变得更有趣。

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

但 DynamoDB 并不是万能的!在某些情况下,关系数据库总是会击败 DynamoDB。

于 2019-04-09T16:25:38.657 回答