- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
tl;dr:如果我不想处理 UUID,将 {unixtimestamp}{randomdigits} 的行 ID(例如 1308022796123456)分配为 BIGINT 是个好主意吗?
只是想知道是否有人对分配给跨多个服务器的数据库记录的 ID/PRIMARY KEY 的任何性能或其他技术考虑/限制有一些了解。
我的PHP+MySQL应用运行在多台服务器上,需要数据能够合并。所以我已经不再使用标准的顺序/自动增量整数方法来识别行。
我对解决方案的研究使我想到了使用 UUID/GUID 的概念。然而,需要更改我的代码以处理将 UUID 字符串转换为 MySQL 中的二进制值的问题似乎有点痛苦/工作。出于存储和性能原因,我不想将 UUID 存储为 VARCHAR。
存储在二进制列中的 UUID 的另一个可能令人烦恼的事实是,在 PhpMyAdmin 中查看数据时,行 ID 并不明显 - 虽然我对此可能是错误的 - 但总的来说,直接数字似乎要简单得多,而且无需转换即可在任何类型的数据库系统中通用。
作为折中方案,我想到了将我的 ID 列设为 BIGINT,并使用当前 unix 时间戳后跟 6 个随机数字来分配 ID。所以假设我的随机数是 123456,我今天生成的 ID 将显示为:1308022796123456
在同一秒内创建的行发生冲突的概率为千万分之一,这对我来说没问题。我不会快速创建任何类型的大量行。
我读到的关于随机生成的 UUID 的一个问题是它们对索引不利,因为值不是连续的(它们散布在各处)。 MySQL 中的 UUID() 函数通过从当前时间戳生成 UUID 的第一部分来解决这个问题。因此,我复制了在我的 BIGINT 开头使用 unix 时间戳的想法。我的索引会很慢吗?
我的 BIGINT 想法的优点:
缺点:
与此相关的一些后续问题:
我应该在末尾使用多于还是少于 6 个随机数字?它会对指数表现产生影响吗?
这些方法之一是“随机”的吗?:让 PHP 生成 6 位数字并将它们连接在一起 -VS- 让 PHP 生成 1 - 999999 范围内的数字,然后进行零填充以确保 6 位数字。
感谢任何提示。对不起,文字墙。
最佳答案
我在职业生涯中遇到过这个问题。我们使用时间戳 + 随机数,当我们的应用程序扩展时(更多客户端、更多服务器、更多请求)遇到了严重的问题。诚然,我们(愚蠢地)只使用了 4 位数字,然后改为 6 位,但您会惊讶于错误仍然发生的频率。
在足够长的时间段内,您保证会遇到重复键错误。我们的应用程序是关键任务,因此即使是由于固有的随机行为而导致失败的可能性很小也是 Not Acceptable 。我们开始使用 UUID 来避免这个问题,并仔细管理它们的创建。
使用 UUID,您的索引大小会增加,索引越大,性能越差(可能不明显,但仍然更差)。然而,MySQL 支持 native UUID 类型(永远不要使用 varchar 作为主键!!),即使与 bigint 相比,它也可以非常有效地处理索引、搜索等。对索引的最大性能影响几乎总是索引的行数,而不是被索引的项目的大小(除非你想在长文本或类似的荒谬的东西上建立索引)。
回答您的问题:如果您不打算显着扩展您的应用程序/服务,Bigint(附有随机数)就可以了。如果您的代码可以在不做太多改动的情况下处理更改,并且您的应用程序不会在发生重复键错误时崩溃,那就继续吧。否则,咬紧牙关,选择更实质性的选择。
你以后总是可以实现更大的改变,比如切换到一个完全不同的后端(我们现在正面临着......:P)
关于MySQL 主键 : UUID/GUID vs BIGINT (timestamp+random),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6338956/
我试图再次将反射的 UUID 转换回实际的 UUID 对象,但找不到方法,当我打印反射值时它看起来是正确的,但在尝试转换时我找不到方法。 package main import ( "fmt"
我想知道 UUID 是否是唯一的,即使它们是在不同的系统上生成的,这些系统可能采用不同的算法。例如,如果您在 MySQL 和 .Net 中生成了一堆 UUID,碰撞的可能性会更高,还是所有系统都使用完
是否可以一个接一个地创建两个重复的 UUID?我不熟悉 UUID 是如何生成的,但我猜想如果您在同一毫秒内从同一 MAC 地址创建了两个单独的 UUID,那么它们将完全相同。这是真的吗? 我想我是在问
当我使用 python uuid 模块中的 UUID() 函数检查我们的测试 uuid 之一时,我遇到了这种奇怪的行为。 从 uuid 导入 UUID uuid1 = UUID('00000000-0
开始使用 java.util.UUID。我的问题是如果我有两个 UUID 变量,比如 u1 和 u2,并且我想检查它们是否相等,我可以安全地使用表达式 u1 == u2 还是必须编写 u1 .equa
我浏览了 python UUID 模块的文档。 >>> uuid.uuid4() UUID('82fe5629-6680-4b13-a4e3-7a082f10e038') >>> uuid.uuid4
我正在创建一个程序,我在其中大量使用 UUID 来识别用户和组等内容。鉴于 UUID 已经被占用的可能性极低,我是否应该担心发生碰撞的可能性? 最佳答案 这在很大程度上取决于 A)您的要求 B)底层实
您应该使用哪个版本的 UUID?我看到很多帖子解释了每个版本的含义,但我很难弄清楚什么最适合哪些应用程序。 最佳答案 有两种不同的方式生成 UUID。 如果您只需要一个唯一 ID,则需要版本 1 或版
我知道我们可以轻松提取 uuid 版本号。有没有可靠的方法来提取时间戳、MAC 地址等信息? 谢谢! 最佳答案 符合标准的 UUID 可能是多种变体之一,它看起来像这样: AAAAAAAA-BBBB-
我可以干净地使用私有(private) UUID 变体/版本吗? 我使用我基本上认为是大整数的随机 UUID。现在,我想生成一个“私有(private)”UUID,它不基于众所周知的 5 个变体/版本
我已阅读 man 页面,但我不明白 name 和 namespace 的用途。 For version 3 and version 5 UUIDs the additional command lin
我目前正在项目中使用 boost::uuids::uuid,并且我想序列化包含 boost::uuids::uuid 的对象。我尝试了下面的简单示例,但出现错误: /usr/include/boost
我正在使用 Datastax Java 驱动程序在 Cassandra 数据库中执行基本的插入语句。我的主键列是uuid类型。从我在官方文档中看到的,在 Cassandra 中调用 uuid() 函数
会抛出异常吗? UUID() 是否会悄无声息地失败?是否有任何情况下“myStatus”来自 myStatus = True myUUID = uuid.UUID( someWeirdValue )
在我的 Android 应用程序中,我有这种采用 UUID 的方法。不幸的是,当我这样做时: OverviewEvent overviewevent = eventAdapter.getOvervie
我有一个简单的 mongo 迁移框架,它正在执行一些传递给它的脚本。 现在我想将我的 LUUID 迁移到 UUID。我写了以下内容: function fixIds(collectionName) {
我有一个非常奇怪的问题是我得到一个有效的 UUID 不是一个有效的 UUID,例如: 'fd31b6b5-325d-4b65-b496-d7e4d16c8a93' is not a valid UUI
我正在测试 Goa对于一个 API。我想使用 uuid 作为 ID 数据类型。我在 controller.go 中修改了以下函数: // Show runs the show action. func
我有一个包含 uuid 和系统列的表。我需要一个查询来仅返回具有 system=1 的 uuid,而不返回具有 system= 1 和 2 的 uuid 最佳答案 SELECT * FROM
我很想了解在 Avro 中编码一种非常特定类型的数据的最佳实践:UUID。 最佳答案 到目前为止,我发现的唯一方法是定义自定义 UUID: { "namespace" : "your.namesp
我是一名优秀的程序员,十分优秀!