主表最简单的主键?

2023-12-05

我的主桌,Users,存储有关用户的信息。我计划有一个UserId字段作为表的主键。我可以完全控制这些键的创建和分配,并且我希望确保以提供良好性能的方式分配键。我应该怎么办?


您有几个选择:

  1. 最通用的解决方案是使用 UUID,如中指定的RFC 4122.

例如,您可以有一个STRING(36)存储 UUID。或者您可以将 UUID 存储为一对INT64或作为BYTE(16)。使用 UUID 有一些陷阱,因此请阅读本文的详细信息answer.

  1. 如果您想节省一点空间并且绝对确定您的用户数将少于数十亿,那么您可以使用 INT64,然后使用随机数生成器分配 UserId。您想要确保自己的用户数量少于几十亿的原因是生日问题,一旦拥有 4B 用户,发生至少一次冲突的几率约为 50%,并且此后增长速度非常快。如果您分配的 UserId 已经分配给以前的用户,那么您的插入事务将会失败,因此您需要为此做好准备(通过在生成新的随机数后重试事务)。

  2. 如果有某个专栏,MyColumn,在您希望将其作为主键的 Users 表中(可能是因为您知道您需要经常使用此列查找条目),但您不确定此列导致热点的趋势(例如,因为它是按顺序生成的或基于时间戳),那么您还有另外两个选项:

3a) 你可以“加密”MyColumn并将其用作您的主键。用数学术语来说,您可以对键值使用自同构,这会产生混乱地打乱它们的效果,同时仍然不会多次分配相同的值。在这种情况下,您不需要存储MyColumn完全分开,而是您只会存储/使用加密版本,并且可以在应用程序代码中必要时对其进行解密。请注意,此加密不需要是安全的,而只需要保证原始值的位以可逆的方式充分加扰。例如:如果 MyColumn 的值是按顺序分配的整数,则只需反转 MyColumn 的位即可创建一个足够混乱的主键。如果您有更有趣的用例,您可以使用类似的加密算法XTEA.

3b) 有一个复合主键,其中第一部分是ShardId,计算为hash(MyColumn) % numShards第二部分是MyColumn。哈希函数将确保您不会通过将行分配到单个拆分来创建热点。有关此方法的更多信息可以找到here。请注意,尽管 md5 或 sha512 是很好的函数,但您不需要使用加密哈希。幽灵哈希也是一个不错的选择。选择正确数量的分片是一个有趣的问题,并且可能取决于实例中的节点数量;它实际上是避免热点的功率(更多分片)和读取/扫描效率(更少分片)之间的权衡。如果您只有 3 个节点,那么 8 个分片可能就足够了。如果你有100个节点;那么 32 个分片是一个值得尝试的合理值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

主表最简单的主键? 的相关文章

随机推荐

  • 添加实例到weka中的Instances

    我有一些 arff 文件 我想按顺序阅读它们并创建一个大数据集 Instances add Instance inst 不会向实例添加字符串值 因此尝试 setDataset 但即使这样也会失败 有没有一种方法可以实现字符串直观上正确的事情
  • 检查什么 CollectionAssert.AreEquivalent

    我正在阅读有关该方法的内容CollectionAssert AreEquivalent in MSDN 文章根据 MSDN 如果两个集合具有相同数量但任意顺序的相同元素 则这两个集合是等效的 如果元素的值相等 则元素相等 但如果它们引用同一
  • NSString 编码特殊字符,如 !@#$%^&

    我如何编码我的 NSString 以便所有特殊字符例如 变成 amp 和 变成 apos 我不确定编码是否是正确的词 所以如果我错了 请纠正我 Thanks 你所说的叫做HTML 实体 有一个类别声称可以解决这个问题 NS字符串 HTML
  • 索引集合的(无序)对

    这是一个自动回答的问题 源自这个更具体的问题OP 在选择错误的 恕我直言 答案后似乎失去了兴趣 我确实检查了之前有关该主题的问题 但似乎没有一个能够解决该问题 那有什么用呢 假设您有 4 个人 Abdul Beatrix Charlie 和
  • Python 中的 is 关键字[重复]

    这个问题在这里已经有答案了 当我阅读 学习Python 时 我对使用is操作员 本书试图将其解释为对相同内存地址的测试 A is B if True 意味着 A 和 B 位于相同的内存地址中 但在下面的情况下 这个解释似乎不成立 谁能帮我理
  • 需要在composer-rest-server中将localhost:3000替换为realip:3000

    我已经在AWS机器上上传了composer rest server 我成功地启动了composer rest server 没有错误 尽管它总是引用http 本地主机 3000 我想将我的 localhost 更改为我在 AWS 上的实际主
  • 如何从 STL 容器中删除元素?

    如何从 STL 容器中删除具有指定的元素value 或者满足一些状况 对于不同类型的容器是否有一个通用或统一的方法 不幸的是 没有一个uniform用于从 STL 容器中删除元素的接口或模式 但出现了三种行为 std 向量模式 从a中删除满
  • Glassfish 服务器上的自动 EJB 计时器未触发

    因此 我在 Glassfish 3 1 上运行 Java EAR 应用程序 我在 EJB 模块中创建了一个带有单个带注释的计时器函数的无状态会话 bean 我没有确切的代码 但它看起来像这样 Stateless public class S
  • jquery cfml 触发器('更改')不起作用

    我需要的是一个绑定到列出文件类型的查询的 cfselect 一个列出已保存文件的 cfdiv 以及一个扫描要保存为 pdf 文件的图像的按钮 其名称以输入字段的值为前缀 简单的页面
  • 如何从多个文件中删除前缀?

    我下载了很多视频 名称如下 site com filename mp4我想删除前缀 以便它们被命名为filename mp4 我尝试使用以下代码创建批处理文件 ren site com mp4 mp4 但结果却是 com filename
  • 从 Pandas 列中分解字典

    我有以下 df movie id rating all 0 tt7653254 age all avg rating 8 1 count 109326 age lt 18 avg rating 8 8 count 318 age 18 29
  • 查询期间失去与 MySQL 服务器的连接? [复制]

    这个问题在这里已经有答案了 可能的重复 查询期间失去与 MySQL 服务器的连接 我正在将一些数据从大型 csv 导入到 mysql 表 在将文件导入表的过程中 我失去了与服务器的连接 出了什么问题 错误代码为2013 查询期间丢失与myS
  • 跨商店与获取属性的关系较弱?

    我想将我的参考数据与核心数据模型中的用户数据分开 以简化我的应用程序的未来更新 并且因为 我计划将数据库存储在云上 并且不需要将参考数据存储在云上 因为这是我的申请的一部分 因此 我一直在寻找一种使用获取的属性来编码跨商店关系的方法 我还没
  • 如何在循环内更新对象属性?

    当尝试使用循环来更改对象中属性的值集时 我发现了一种意想不到的行为 基本上 我在循环之外声明我的对象 然后我循环一个数值数组 这些值用于更新对象属性 在循环内 我将当前对象状态存储在外部数组中 结果是 我最终没有使用包含一系列具有不同数值的
  • opencv canny:如果您使用黑白图像,minVal 和 maxVal 重要吗?

    前言 这是本文的延续这个问题 考虑以下代码 取自here import cv2 import numpy as np from matplotlib import pyplot as plt img cv2 imread messi5 jp
  • 当前缀字符串与非前缀字符串相邻时,字符串文字连接失败?

    在我认为符合 C 11 的 MSVS2013 中 编译器不喜欢以下内容 LPCTSTR str T boo hoo 翻译过来就是 wchar t const str L boo hoo 根据cppreference com 我知道这不是确定
  • 如何在 Laravel 中对超过 3 个表使用“hasManyThrough”?

    如中所述docs当前的有很多通过当你有类似的东西时可以使用country gt users gt posts 这会导致类似的结果Country whereName xx gt posts 这很棒 但是如果我有更多的东西怎么办 country
  • 如何在运行时向 JSON 添加属性 (C#)

    注意 我正在使用 System Text Json 包 下面是我从数据库获取的 JSON 我必须检查 JSON 中的每个键并检查是否有句点 在键名称中 如果是这样 我需要添加一个属性required与价值true在 JSON 中以提供运行时
  • 如何在 Google 地图中合并圆圈

    我希望能够使用 javascript 在 Google 地图上绘制多个圆圈 但将它们组合为 单个形状 以便它们的区域不重叠 而是共享 例如 我在 WalkScore com 上找到了这个例子 您可以看到它们是组合圆圈 而不是将它们重叠为单独
  • 主表最简单的主键?

    我的主桌 Users 存储有关用户的信息 我计划有一个UserId字段作为表的主键 我可以完全控制这些键的创建和分配 并且我希望确保以提供良好性能的方式分配键 我应该怎么办 您有几个选择 最通用的解决方案是使用 UUID 如中指定的RFC