我的生产环境有 6 GB
MySQL InnoDB
表,其中有一些 BIGINT SIGNED
列,但存储的值都大于 0
,并且将来没有机会填充负值。如果我将它们全部或部分转换为UNSIGNED
,性能会明显提高吗?转换过程中桌子是否有可能被压坏?
这一点对你来说真的很重要吗?性能通常归结为您正在操作的数据的基本类型(例如
VARCHAR
与 INT
),而不是符号位。正如 VARCHAR(20)
和 VARCHAR(21)
的性能基本相同,我相信您很难找到 BIGINT
和 UNSIGNED BIGINT
之间的 可测量的性能差异。
由于
BIGINT
可以存储天文数字般的巨大值,因此您不太可能需要最后一点。 INT
可以溢出 21 亿,一些应用程序预计会超过这个数字。推文数量超过 20 亿条,Facebook 帖子数量超过 20 亿条,等等,但大多数应用程序很少会看到超出的数量。
不要担心无法衡量的问题。如果您认为存在问题,请测量它。如果您的测量结果不确定,您可以使用不同的方法重试,或者接受您的直觉可能是错误的事实。
如今计算机的速度快得离谱,一些系统可以将数据库转储到内存中并在五秒内扫描它。如果您关心每一纳秒,那么首先要从容易实现的目标开始,例如您的索引策略或您选择的文件系统、您的 MySQL 配置。
有符号的 BigInt 范围是 -9223372036854775808 到 9223372036854775807。
无符号 BigInt 范围为 0 到 18446744073709551615。
例如,我们使用无符号 BigInt 来表示“id”,因为“id”始终为正数(而不是负数)。