【问题标题】:Is there any difference in saving same value in different integer types?在不同的整数类型中保存相同的值有什么区别吗?
【发布时间】:2016-02-08 14:03:27
【问题描述】:

Django中主要的整数字段如下,

整数字段

一个整数。从 -21474836482147483647 的值在 Django 支持的所有数据库中都是安全的。当 localize 为 False 时,此字段的默认表单小部件是 NumberInput,否则为 TextInput。


小整数字段

类似于 IntegerField,但只允许某个(依赖于数据库的)点下的值。从 -3276832767 的值是 在 Django 支持的所有数据库中安全。


大整数字段

一个 64 位整数,很像 IntegerField,只是它保证适合从 -92233720368547758089223372036854775807 的数字。此字段的默认表单小部件是 TextInput。


如果我有一个数字,33432(适合所有​​字段的某个数字),如果我选择在以下所有字段中存储相同的数字,是否会过度使用内存数据库还是运行时?

number0 = models.SmallIntegerField()
number1 = models.IntegerField()
number2 = models.BigIntegerField()

我的数据库是 PostgreSQL。

【问题讨论】:

    标签: python django postgresql database-design django-models


    【解决方案1】:

    对于普通的integer,大多数操作最快,但差异非常小,通常是优化性能时您最不关心的问题。

    存储大小更相关,但各种整数类型之间的差异仍然很小,通常几乎不相关,有时会丢失填充和对齐。还有其他数据类型会浪费更多空间。

    smallint (int2) 在磁盘和 RAM 中占用 2 个字节。
    integer (int, int4) 在磁盘和 RAM 中占用 4 个字节。
    bigint (int8) 在磁盘和 RAM 中占用 8 个字节。

    Details for numeric types in Postgres in the manual.

    实际存储大小还有各种其他因素。您必须考虑页面和元组开销、对齐和填充、可能的 NULL 值、索引...

    详情:

    有一些优化的潜力,但通常不多。最好集中精力为您的数据选择合适的数据类型,不要担心存储和性能方面的细微差别,除非您确切知道自己在做什么。

    【讨论】:

      【解决方案2】:

      是的,为您的数字数据分配的内存存储和运行时内存将与您选择的数字结构的字节大小成正比。

      有一些压缩方法,例如将整数和小数更改为可变长度格式,而不是 SQL Server 的原生固定长度格式。但是,正如here 所述,它们会引入更高的 CPU 使用率。

      【讨论】:

      • 运行时内存分配我能理解,但是数据库端呢? BigIntegerField 中的 -21474836472147483647 范围内的数字是否在浪费内存?
      • 当然是在浪费内存。这在一天结束时是否重要
      • 如果您的数字始终保持在 INT 范围内,并且您选择了 BIGINT,那么每个值都会浪费 4 个字节的内存。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2017-07-28
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多