一般来说,我总是使用整数。我知道理论上这不是最佳实践,因为您应该使用可以保证存储数据的最小数据类型。
例如,tinyint
当您知道您将存储的唯一数据是 1、0 或 null(稍后将其扩展为 2 或 3 的可能性很小)时,最好使用它。
但是,我知道这样做的唯一原因是出于存储目的——在一行上使用 1 个字节而不是 4 个字节。
除了节省硬盘空间之外,使用tinyint
(或smallint
什bigint
至)超过 just有什么影响?int
一般来说,我总是使用整数。我知道理论上这不是最佳实践,因为您应该使用可以保证存储数据的最小数据类型。
例如,tinyint
当您知道您将存储的唯一数据是 1、0 或 null(稍后将其扩展为 2 或 3 的可能性很小)时,最好使用它。
但是,我知道这样做的唯一原因是出于存储目的——在一行上使用 1 个字节而不是 4 个字节。
除了节省硬盘空间之外,使用tinyint
(或smallint
什bigint
至)超过 just有什么影响?int
磁盘空间很便宜……这不是重点!
不要再考虑存储空间,而是考虑缓冲池和存储带宽。在极端情况下,CPU 缓存和内存总线带宽。链接的文章是该系列文章的一部分,重点介绍了集群键选择不佳(INT vs GUID vs Sequential GUID)的问题,但它强调了字节可以产生的差异。
最重要的信息是设计问题。在您达到 VLDB 领域之前,差异不会显示在适当规范的服务器上的单个数据库中,但如果您可以节省几个字节,为什么不这样做。
我想起了前面问题中描述的环境。每个 SQL 实例有 400 多个数据库,大小从 50mb-50GB 不等。在该环境中为每个记录、每个表、每个数据库清理几个字节可能会产生重大影响。
除了其他答案...
行和索引条目存储在 8k 页中。因此,每行 3 个字节的一百万行在磁盘上并不是 3 MB:它会影响每页的行数(“页面密度”)。
这同样适用于 nvarchar 到 varchar、smalldatetime 到 datetime、int 到 tinyint 等
编辑,2013 年 6 月
http://sqlblog.com/blogs/joe_chang/archive/2013/06/16/load-test-manifesto.aspx
这篇文章指出
所以,数据类型的选择很重要
考虑的不仅仅是表存储。如果您使用 int 列是复合键的一部分的索引,您自然会希望索引页尽可能完整,这是索引条目尽可能小的结果。
我肯定会发现使用较小的数据类型检查 BTREE 页面中的索引条目会更快一些。但是,索引条目中涉及的任何 VARCHAR 都会抵消(抵消)使用 TINYINT 而不是 INT 获得的性能提升。
尽管如此,如果索引条目有复合条目并且都是整数,那么整数越小,越快越好。
当数据库变得更大时,所有事情都会变得复杂:
什么数据类型与此有关?一切。使用大于必要的行大小会使数据库页面在需要之前填充,或者如果行大小使得不能在页面上记录超过一条记录,甚至会浪费空间。结果是需要写入和读取更多页面,更多 RAM 内存用于缓存(更大的记录需要更多内存)。而且由于您指定的数据类型大于磁盘所需的数据类型,因此您的索引将遇到同样的问题 - 特别是如果您将复合 2 BIGINT 列的主键聚集在一起,因为创建的任何其他索引都会在其定义中隐式复制该主键。
如果您知道表中的某些列将有数百万行,甚至是一个小表,它将 FK'ed 到数百万行,不需要 4 字节整数来存储它们的数据,但是 2 字节将足够了 - 使用SMALLINT。如果 0-255 范围内的值足够,则TINYINT。是/否标志?有BIT。
虽然 for
tinyint
与int
在磁盘空间、页面拆分和维护时间等方面存在明显差异,但对于varchar
.那么为什么不将所有文本字段声明为
varchar(4000)
,因为无论如何它只会占用所需的空间?甚至可以保证您的数据永远不会被截断。答案当然是:
这些同样的原因也适用
tinyint
。