0

我在 RDS 实例上有这张表:

+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| id           | bigint(20)          | NO   | PRI | NULL    | auto_increment |
| match_id     | bigint(10) unsigned | NO   | MUL | NULL    |                |
| prop_type_id | bigint(10) unsigned | NO   |     | NULL    |                |
| title        | varchar(45)         | NO   | MUL | NULL    |                |
| odds         | double              | YES  |     | NULL    |                |
| status       | tinyint(4) unsigned | YES  |     | 1       |                |
| selection_id | bigint(15)          | YES  | MUL | NULL    |                |
| market_id    | bigint(15)          | YES  | MUL | NULL    |                |
| date_time    | datetime            | NO   |     | NULL    |                |
| available    | int(11)             | NO   |     | NULL    |                |
| source       | tinyint(4)          | YES  |     | NULL    |                |
+--------------+---------------------+------+-----+---------+----------------+

我们为索引找到的最佳设置是在 match_id、prop_type_id、selection_id 和 market_id 上设置它们。

目前数据库的大小约为 1.5 Gb,我们每秒对该表进行 100 到 500 次查询,很快这个数据会更高。其中大约 75% 是选择,其他是更新和删除。数据非常不稳定。这会导致 MyISAM 挂起和 InnoDB 出现大量死锁。

我已经尝试过 SimpleDB,除了需要大约 18 个小时来修改我们的 Rails 代码以使用它之外,现在一个简单的选择需要 1 到 6 秒之间的任何时间,而且它并不总是一致的。我不得不对其进行大量内存缓存,但这是一个主要缺点 - 我们希望数据在数据库中更新,并且最多每 8 秒左右在屏幕上更新一次。

想把它移到 DynamoDB 上,希望它能在高流量场景中表现得更好。

现在的挑战是我们需要根据以下内容进行搜索: - id(可以是任何东西,只要它们是唯一的,但我们在查询时并不总是使用它) - match_id - prop_type_id - title - selection_id - market_id -状态 (0..2)

通常我们查询 match_id 和 prop_type_id,或者 match_id、prop_type_id、market_id 和 selection_id。基于标题的查询很少见,但无法避免。状态也一样。

有没有一种方法可以为 DynamoDB 建模?

我知道它们只支持另外 5 个索引,而且它们还要求始终知道 ID。如果不先查找数据,我应该如何知道 ID,我不知道,但也许我做错了整个事情?

谢谢!

4

2 回答 2

3

正如您所注意到的,本地二级索引不适合您的查询模式。

此时,您需要使用多个 DynamoDB 表构建自己的索引,这意味着您的应用程序需要写入主表以及充当主表索引的表。例如,您的主表可能有“id”作为哈希键,您的索引表可能有“match_id”作为哈希键,“id”作为范围键。

于 2013-04-30T07:13:40.540 回答
1

但我认为您的案例适合 DynamoDB。

可以这样做:

match_idprop_type_id放入一个复合属性中,并使该属性成为范围键。同时,让Id作为哈希键。

market_id然后,您也可以使用selection_Id“projected”设置二级本地索引。然后,您可能还想设置另一个二级本地索引Title

于 2013-05-17T05:52:02.777 回答