AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 4968
Accepted
Richard
Richard
Asked: 2011-08-24 06:25:24 +0800 CST2011-08-24 06:25:24 +0800 CST 2011-08-24 06:25:24 +0800 CST

何时在 INT 上使用 TINYINT?

  • 772

一般来说,我总是使用整数。我知道理论上这不是最佳实践,因为您应该使用可以保证存储数据的最小数据类型。

例如,tinyint当您知道您将存储的唯一数据是 1、0 或 null(稍后将其扩展为 2 或 3 的可能性很小)时,最好使用它。

但是,我知道这样做的唯一原因是出于存储目的——在一行上使用 1 个字节而不是 4 个字节。

除了节省硬盘空间之外,使用tinyint(或smallint什bigint至)超过 just有什么影响?int

sql-server database-theory
  • 5 5 个回答
  • 62475 Views

5 个回答

  • Voted
  1. Best Answer
    Mark Storey-Smith
    2011-08-24T07:16:06+08:002011-08-24T07:16:06+08:00

    磁盘空间很便宜……这不是重点!

    不要再考虑存储空间,而是考虑缓冲池和存储带宽。在极端情况下,CPU 缓存和内存总线带宽。链接的文章是该系列文章的一部分,重点介绍了集群键选择不佳(INT vs GUID vs Sequential GUID)的问题,但它强调了字节可以产生的差异。

    最重要的信息是设计问题。在您达到 VLDB 领域之前,差异不会显示在适当规范的服务器上的单个数据库中,但如果您可以节省几个字节,为什么不这样做。

    我想起了前面问题中描述的环境。每个 SQL 实例有 400 多个数据库,大小从 50mb-50GB 不等。在该环境中为每个记录、每个表、每个数据库清理几个字节可能会产生重大影响。

    • 98
  2. gbn
    2011-08-24T10:53:22+08:002011-08-24T10:53:22+08:00

    除了其他答案...

    行和索引条目存储在 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

    这篇文章指出

    重要的标准是基数和页行比。

    所以,数据类型的选择很重要

    • 30
  3. RolandoMySQLDBA
    2011-08-24T07:39:46+08:002011-08-24T07:39:46+08:00

    考虑的不仅仅是表存储。如果您使用 int 列是复合键的一部分的索引,您自然会希望索引页尽可能完整,这是索引条目尽可能小的结果。

    我肯定会发现使用较小的数据类型检查 BTREE 页面中的索引条目会更快一些。但是,索引条目中涉及的任何 VARCHAR 都会抵消(抵消)使用 TINYINT 而不是 INT 获得的性能提升。

    尽管如此,如果索引条目有复合条目并且都是整数,那么整数越小,越快越好。

    • 14
  4. Fabricio Araujo
    2012-06-28T12:48:03+08:002012-06-28T12:48:03+08:00

    当数据库变得更大时,所有事情都会变得复杂:

    • 维护窗口需要扩大或重新安排
    • 备份(一天结束的完整备份变成了一个荒谬的时间消耗者,因此您需要差异甚至日志备份,并且每周进行一次完整备份,也许每月一次)
    • 性能维护成为时间消耗者(在数百万行表上创建索引需要不小的时间来执行)并且需要重新安排并且如果表很宽会变得更糟......
    • 通过网络传输 100Gb 备份并不是我所说的小菜一碟 - 特别是如果网络(出于某种未知原因)顽固地放弃 75Gb 标记上的连接......(发生在我正在工作的安装中正在备份到网络上的映射驱动器)...

    什么数据类型与此有关?一切。使用大于必要的行大小会使数据库页面在需要之前填充,或者如果行大小使得不能在页面上记录超过一条记录,甚至会浪费空间。结果是需要写入和读取更多页面,更多 RAM 内存用于缓存(更大的记录需要更多内存)。而且由于您指定的数据类型大于磁盘所需的数据类型,因此您的索引将遇到同样的问题 - 特别是如果您将复合 2 BIGINT 列的主键聚集在一起,因为创建的任何其他索引都会在其定义中隐式复制该主键。

    如果您知道表中的某些列将有数百万行,甚至是一个小表,它将 FK'ed 到数百万行,不需要 4 字节整数来存储它们的数据,但是 2 字节将足够了 - 使用SMALLINT。如果 0-255 范围内的值足够,则TINYINT。是/否标志?有BIT。

    • 14
  5. yoel halb
    2012-08-24T17:43:56+08:002012-08-24T17:43:56+08:00

    虽然 fortinyint与int在磁盘空间、页面拆分和维护时间等方面存在明显差异,但对于varchar.

    那么为什么不将所有文本字段声明为varchar(4000),因为无论如何它只会占用所需的空间?甚至可以保证您的数据永远不会被截断。

    答案当然是:

    1. 澄清您的意图(因为没有人会理解为什么名称字段应该是 4000 个字符)
    2. 验证,以确保没有人输入完整的传记作为名称。

    这些同样的原因也适用tinyint。

    • 9

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve