对于存储 128 位 UUID,有多种存储选项:
- 一个字节 [16] 列
- 两个 bigint/long(64 位)列
- 一个 CHAR(36) 列 - 32 个十六进制数字 + 4 个破折号。
- 一个 UUID 数据库特定列,如果 db 支持它
从索引的角度来看,哪些是最有效的?如果数据库不支持专用的 uuid 类型,那么 1、2、3 中的哪一个是最佳候选者?
对于存储 128 位 UUID,有多种存储选项:
从索引的角度来看,哪些是最有效的?如果数据库不支持专用的 uuid 类型,那么 1、2、3 中的哪一个是最佳候选者?
专用
uuid
类型是 PostgreSQL 的最佳选择。很难用其他数据库说 - 有人隐含一种uuid
存储效率低于简单字节类型的类型并非不可能。同样在 PostgreSQL 中,
bytea
如果您没有该uuid
类型,这将是一种存储 UUID 的合理方法。对于其他数据库,这取决于它们如何存储二进制数据。在可能的情况下,我强烈避免使用带有破折号的十六进制。比较、排序和存储的效率较低。
所以真的,“不是(2)或(3)”。曾经。在支持的情况下使用 (4),否则使用 (1)。
按优先顺序:4,1,2,3 如果使用 SQL Server,则不要使用 UUID 作为集群键,不仅它会严重碎片化,集群键用于所有非聚集索引,并且您会将这些字节添加到每个索引行。使用 NEWSEQUENTIALID 可以减轻碎片化,但通常更喜欢使用 bingint 标识作为集群键而不是 GUID,以防止其他索引膨胀。
选择 1 而不是 2 之间的区别将取决于数据库在处理单列固定数组的两列基本类型时的效率。使用虚拟数据进行测试应该很容易。查看查询的速度以及索引和数据的大小。小+快是最好的!
人们不得不假设任何本机支持的数据类型在产品中都比任何可以作为该产品的客户端组合在一起的数据类型得到更好的优化。之后,无论字节数最小,因此您可以获得每页的最大行数。