【问题标题】:randomized code in mysql databasemysql数据库中的随机代码
【发布时间】:2014-05-05 18:42:28
【问题描述】:

我想我最好问这个问题,而不是在没有任何实验的情况下猜测。

我们计划添加一个新列作为代码

代码需要具备以下特点:

  1. 它必须是独一无二的。
  2. 最好是字符串,我们迁移数据要容易得多
  3. 必须是随机的,有足够的空间以避免碰撞。

我打算只使用 UUID。

create table code(
  id char(36),
  unique index index1 (id)
) type=innodb;

我们的操作行为:

  1. 插入新代码(每天最多 20K)
  2. 逐行获取(非常繁重,我们可能需要在有限的时间内获取数据库中的每一行,例如 10 分钟)。

现在我有点担心性能。我们的数据库中已经有 400K 行。未来它可能会增长到 10M 或 30M。

您有什么建议或有什么问题吗?

顺便说一句:我不能使用自动递增的 int,因为它不是随机的。

【问题讨论】:

  • 没有一个 UUID 的一部分是随机的。它们是 100% 计算的。您将与随机发生碰撞。如果您提供更多详细信息,您将获得更好的答案。为什么随机?行数据中还有什么?多大?
  • 没有。 可以生成 UUID。或者它们可以是随机的。请参阅:docs.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html(第 4 版)
  • 不,不会有任何冲突。 UUID 使用 SecureRandom 生成 16 个随机字节。即使有 3000 万个条目,发生冲突的机会也大约是 1 比 10^31

标签: mysql random key


【解决方案1】:

继续。无论是使用 mysql 还是使用 UUID,您都不会遇到任何问题。

随机生成的 UUID 具有足够的状态,肯定不会发生冲突。 (确实,这仍然是一个机会,但在 30M 条目的情况下,它的 1 比 10^31。)

另一方面:既然您可以轻松地使用 SecureRandom 生成 16 字节值并使用它们,为什么还要使用 uuid(它将您的随机数分成 5 组,完全没有意义)?

根据这个答案:How to store uuid as number? 将它们以二进制形式存储在 mysq 中会更快。

你也想读这个:UUID performance in MySQL?

在使用 mysql 时,您应该考虑备份的概念。 Mysql 将轻松处理大型数据库,但导出/导入 30M 行可能需要一些时间。

对于 mysql 行限制,请参阅这个问题:How many rows in a database are TOO MANY?

【讨论】:

    【解决方案2】:

    我建议不要在这些情况下使用 MySQL(至少不是您主动搜索的主存储)。

    还有许多不同的其他技术,例如:

    • Apache Lucene
    • Apache Solr
    • 弹性搜索
    • 还有更多...

    这些工具专为快速搜索大数据集而构建。上面看起来有点矫枉过正,您可能只需使用其中一个 NoSQL 数据库,它会在您的情况下为您提供更多性能。

    有大量文章比较所有这些之间的性能和限制。

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 2012-06-25
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2012-05-18
      • 1970-01-01
      • 2013-04-24
      相关资源
      最近更新 更多