10亿个唯一字符串,同时插入数百万个

时间:2013-08-02 01:41:31

标签: mysql database concurrency insert unique

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

我对可以在ec2实例上合理设置的任何建议持开放态度。也许redis可以实现我想做的但我尚未使用它。任何人都可以建议最有效的方式来存储超过十亿个独特的字符串,同时插入数百万个吗?

2 个答案:

答案 0 :(得分:0)

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

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

然后,您将使用某种哈希来确定哪个名称将放在哪个数据库中。例如,以A-D开头的名称放在一个,E-H放在另一个,等等。

答案 1 :(得分:0)

1)我建议MariaDB超过MySQL - 你通常会获得更好的性能。 MariaDB可以有多个活动的母版用于编写。它是MySQL的直接替代品,万一您还没有意识到它。

2)你在用于存储用户名的字段中是否有索引?

3)Redis是一个很好的选择。我经常使用它,它非常简单快速。我仍然无法告诉你它在这种负载下的表现如何,但它很容易设置和尝试。如果需要,可以设置Redis群集。