【问题标题】:1 billion unique strings while inserting millions concurrently [closed]10 亿个唯一字符串,同时插入数百万个 [关闭]
【发布时间】:2013-08-02 01:41:30
【问题描述】:

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

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

【问题讨论】:

    标签: mysql database concurrency insert unique


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答,您是正确的索引锁定成为一个问题。我没有想过在机器上使用多个数据库,但这是一个非常新颖的解决方案。这将需要我更多的资源来完成,但我并不反对这样做。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回答,我确实在用户名上有一个主索引,但在并发速度下,我正在查找和插入索引锁定成为一个问题。我不确定 MariaDB 是否会用 Redis 解决这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多