如果我知道值不会超过255,那么设置tinyint字段有什么优势吗?

3
我应该选择最小的数据类型,还是如果我存储例如1这样的值,列数据类型无关紧要,该值将占用相同的内存大小吗?
问题也在于,因为我总是需要在应用程序中进行转换和操作。
更新
如果值为"a",我认为varchar(1)和varchar(50)具有相同的内存大小,我以为int和tinyint也是一样的,根据答案,我明白它们不是一样的,是吗?
4个回答

5
始终选择最小的数据类型。SQL无法猜测您希望的最大值是什么,但一旦告诉它数据类型,它就可以优化存储和性能。
回答您的更新: varchar只占用实际使用的空间,因此您说的字符“a”将占用1个字节(在拉丁编码中),无论您选择多大的varchar字段。但是,在SQL中,其他任何类型的字段都不是这种情况。
但是,如果您将所有内容都作为varchar字段,则可能会牺牲效率以节省空间。如果所有内容都是固定大小的字段,则SQL可以执行简单的恒定时间乘法来查找您的值(类似于数组)。如果其中有varchar字段,则查找数据存储位置的唯一方法是遍历所有先前的字段(类似于链接列表)。
如果您刚开始学习SQL,我建议您远离varchar字段,除非您希望某些字段有时包含很少的文本,有时包含很多的文本(如博客文章)。使用可变长度字段的最佳效果需要经验,即使是我大部分时间也不知道该怎么做。

2
一个 varchar 占用 length + 1 字节(例如:"a" = 2 字节)。额外的字节是为了告诉数据库数据实际长度。 - nickf
@nickf:实际上,长度+2可以达到8000。 - gbn

4
这是与系统设计特定性能考虑相关的问题。一般来说,您可以将更多数据放入 Sql Server 数据页中,性能会更好。
Sql Server 中的一个数据页大小为 8k。使用 tinyint 而不是 int 将使您能够将更多数据放入单个页面中,但您必须考虑是否值得这样做。如果您每分钟要提供数千个访问量,则需要这样做。如果这是一个爱好项目或只有几十个用户会看到它,那么这并不重要。

我同意在追求性能时,尽可能使用最小的数据类型是更好的选择。但为什么即使在业余场景下也要浪费存储呢?你永远不知道一个小型企业何时会一夜之间爆发,而当这种情况发生时,您需要重新设计的内容越少就越好。当然,您也可能会采用相反的方法:使用INT列,然后在达到INT上限时需要BIGINT。 - Aaron Bertrand
3
我喜欢将业余时间看作是学习那些我不想在生产时间中学习的事情的时间。为什么不总是遵循好习惯呢? - Kai

0

优势是存在的,但除非您有大量行并执行许多操作,否则可能不会很显着。这将带来性能提升和更小的存储空间。


0

传统上,每节省一点页面大小的位数都意味着一点速度的提升:更窄的行意味着每页可以容纳更多的行,这意味着消耗更少的内存和更少的IO请求,从而提高速度。然而,使用SQL Server 2008 页面压缩后,情况开始变得模糊起来。压缩算法可以将值小于255的4字节整数压缩到不到一个字节的空间。

行压缩算法将对于小于127(int为有符号)的值,将4字节整数存储在单个字节中,对于小于32768的值,则存储在2个字节中,以此类推。

然而,考虑到这些良好的压缩功能仅适用于企业版服务器,因此保持使用最小可能的数据类型的习惯是有意义的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接