我发现有一个名为 SERIAL 的 mysql 数据类型,它似乎是为用作 id 列而设计的。然而,我的一些同行认为 SERIAL 隐含的真实数据类型 BIGINT 不适合可能永远不会变大的表。
是否有任何理由避免对表 id 列使用 SERIAL 类型?
有什么明显的警告吗?
我发现有一个名为 SERIAL 的 mysql 数据类型,它似乎是为用作 id 列而设计的。然而,我的一些同行认为 SERIAL 隐含的真实数据类型 BIGINT 不适合可能永远不会变大的表。
是否有任何理由避免对表 id 列使用 SERIAL 类型?
有什么明显的警告吗?
唯一真正关心的是尺寸。
如果一张桌子真的很小,为什么会膨胀呢?例如,如果您的表永远不会超过 255 行,请使用
TINYINT UNSIGNED
forid
。无需将表格的列膨胀 8 倍。这也适用于主键。加载包含数据的表后,您应该运行此
对于任何 < 4,294,967,296 行的表,PROCEDURE ANALYSE()绝不会推荐
BIGINT
. 就字节宽度而言,较小的数字键总是比较大的数字键处理得更快。将进一步受害的是索引。为什么 ?
鉴于这两点,Primary Key 越大,需要的空间就越多,也就越有可能需要额外的 InnoDB 页面。
因此,对于填充表,我的建议是让PROCEDURE ANALYSE()告诉正确的数据类型。对于空表,尝试预测期望值的数量,并将数据类型设置为以下:
id < POWER(256,1)
(256),TINYINT UNSIGNED
id < POWER(256,2)
(65536),SMALLINT UNSIGNED
id < POWER(256,3)
(16777216),MEDIUMINT UNSIGNED
id < POWER(256,4)
(4294967296),INT UNSIGNED
SERIAL 还有另一个缺陷,我反复看到但一直无法追查。增量不是 1。通常是 4-7。所以你会得到 1、5、11、18、22 等的 ID,缺少所有的中间值。
恕我直言,永远不要使用“串行”。原因是串行不会产生增量增加。第一个序列可能是“1”,但第二个可能是“4”,第三个可能是“11”。如果那没关系,那就去吧。使用明显太大的索引没有缺点(不再)。我们不再在内存以 K 为单位的机器上运行。不要采用不再适用的旧公理。