0

我有超过十亿个代表用户名的唯一字符串,我每隔几分钟就会同时添加数百万个字符串,超过 50% 是重复的。我目前正在使用带有 mySQL 的 InnoDB 表。我正在使用 INSERT IGNORE 但服务器根本无法跟上同时添加数百万的负载(使用超大 CPU EC2 实例)。为了解决这个问题,我将用户名批量存储,并在可能的情况下使用服务更新唯一表。

我愿意接受任何可以在 ec2 实例上进行合理设置的建议。也许redis可以实现我想做的但我还没有使用它。任何人都可以建议在插入数百万个字符串的同时存储超过十亿个唯一字符串的最有效方法吗?

4

2 回答 2

0

瓶颈必然是每次检查新键是否重复时索引查找的绝对数量,以及每次插入新行时更新索引。每次发生这种情况时都需要锁定整个表。这种方法最终不会扩展。

我建议为此使用多个数据库实例!这样,这些插入操作可以跨多台机器和多个磁盘并行运行。

然后,您将使用某种散列来确定哪个名称将进入哪个数据库。例如,以A-Dgo in one、E-Hgo in another 等开头的名称。

于 2013-08-02T01:46:14.697 回答
0

1)我推荐MariaDB而不是 MySQL——你通常会获得更好的性能。MariaDB 可以有多个活动的 master 进行写入。它是 MySQL 的直接替代品,以防您不知道。

2)您在存储用户名的字段上是否有索引?

3) Redis 是一个不错的选择。我经常使用它,它非常简单快捷。我仍然无法告诉您它在该负载下的性能如何,但它很容易设置和尝试。如果需要,您可以设置 Redis 集群。

于 2013-08-02T01:55:26.843 回答