MySQL:使用一个以Auto Increment为主键的Integer-我应该将其声明为unsigned吗



创建表时,我经常使用以AUTO_INCREMENT为主键(代理键)的INTEGER列,如下所示:

CREATE TABLE 'my_table' (
    user_id INTEGER AUTO_INCREMENT PRIMARY KEY,
    […]
);

(请注意,省略号只是为了将示例集中在重要内容上。)

现在我已经读到了INTEGER列可以在无符号时包含-2147483648到2147483647以及0到4294967295的整数。

由于user_id将始终是无符号的(如果我没有记错的话,MySQL从0开始计数),因此将此列显式标记为UNSIGNED以允许更多用户存储在该表中(4294967295而不是2147483647)有意义吗?

根据http://dev.mysql.com/doc/refman/5.0/en/integer-types.html,未签名INT和签名INT的大小,所以这不会对您的选择产生影响。据我所知,AUTO_INCREMENT从1开始,所以如果您认为需要超过2147483647行,请选择无符号整数。

Unsigned允许改进基于该字段的查询。

除此之外,并没有真正的区别

请参阅此链接上的文章>>已签名与未签名,了解为什么查询速度更快的更多信息。


假设以下查询,其中"quantity"是INT字段。

SELECT *
FROM customer
WHERE quantity <= 500 

如果quantity不是无符号的,那么quantity字段是一个"int",并且您有该字段的索引,MySQL将定义范围为-2147483648到500,并根据该范围获得结果。

但是,如果quantity字段IS无符号,则该范围将为0-500。一个小得多的范围。


这里唯一适用的其他约定是信息的实际存储。无符号,因为它的基数是0-4m,二进制计数越高,需要更多的存储空间。其中带符号的是0-2m,如果它是正的或负的,则有1位要标记。这样可以减少存储需求。

摘要

如果您想节省空间,请使用Signed。如果需要速度,请使用Unsigned

相关内容

  • 没有找到相关文章

最新更新