- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在一个表中存储了 5000 本书,该表包含标题、作者、年份和 ISBN。现在我正在制作一张书评表。哪个更有效或者更好的方法是在书籍表中为 id 创建一个列并使用该 id 将书籍评论存储在评论表中,或者使用书籍的 ISBN 号存储为一个字符(10)?
当我说“高效”时,我的意思是“节省存储空间”。
最佳答案
我想说的是,如果表经过精心设计,添加一个人工 smallint
主键在存储空间方面会更便宜。
smallint
占用 2 个字节,而 character(10)
(与直觉相反,varlena
)包含 ASCII 字符, 将消耗 14 个字节。
在表中,多出的 2 个字节会被浪费掉,但不要忘记,您将在主键列上建立索引。所以索引值实际上会存储两次:一次在表中,一次在索引中。
为简单起见,让我们忽略元组 header 和其他开销。
使用 ISBN 作为主键会导致每个表行额外占用 14 个字节。
添加 smallint
主键会向表中添加两个字节,向索引中添加两个字节,总共添加四个字节。
所以添加一个smallint
主键应该可以节省空间。
你不应该忽视对齐问题。所有数据类型都存储在内存地址中,这些地址是某些 2 的幂的倍数。这是处理器架构所要求的。 smallint
通常有 2 位对齐,character
有 1 位对齐,而例如 timestamp
有 8 位对齐。
所以如果你的表定义为
CREATE TABLE book (
id smallint PRIMARY KEY,
issue_time timestamp with time zone,
isbn character(10)
);
然后表格数据看起来像这样:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | |X|X|X|X|X|X| | | | | | | | | ... (ISBN omitted)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
id padding issue_time
该行以 8 字节边界对齐,从 id
末尾到 issue_time
开头的六个字节将是空的“填充字节”。
因此,要充分利用它,您必须考虑定义列的顺序。
为什么这一切在现实中不是很相关:
无论如何,包含 5000 或 10000 个条目的表都很小。
尽管在这里优化空间,但充其量只是不必要的微优化。
但是在计划表上可能是一个聪明的想法很容易在以后适得其反:如果——与你的预期不同——你想在表中存储 70000 本书,你会发现一个 smallint
是不够的,即使你允许负的 id
秒。当您必须更改主键的数据类型以及在实时系统中引用它的所有外键时,您将不得不忍受的痛苦将远远超过您通过巧妙的优化节省大约 100 KB 所获得的任何乐趣。
关于database - smallint 或 character(10) 哪个更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58122176/
PostgreSQL 是否有一个常量(如 MAXFLOAT in Objective-C )作为 smallint 的最大值? 我知道 PostgreSQL numeric types documen
有比smallint(16bit)更小的数据类型吗?我需要一个只有从 1 到 31 的数字的列,所以我认为 5 位就足够了,我不想浪费空间,因为每个元组有 11 位的开销。 最佳答案 在docs没有这
我是 SQL Server 的新手,这个问题可能会在这里重复出现。因为我还没有找到解决我的问题的方法。我想在这里发帖。所以这是我的问题 select(volume * speed) from tra
我需要定义一个具有十六进制值的 SmallInt 常量。以某种方式像这样: const a: SmallInt = $8000; 当然,$8000 值违反了 SmallInt 的子范围边界。我知道
现在我有一个包含展示次数、点击次数和点击率的表格。 我想知道是否应该使用tinyint(1)并存储范围为1-250的ctr 或者我应该将其存储为具有更高精度的 float 。或者可能是十进制。 对于统
如果这个问题已经得到解答,我深表歉意,我使用了搜索功能,但找不到与此完全匹配的问题。 我正在尝试通过 mysql_query 将邮政编码字段(澳大利亚)插入我的数据库,我已确认一切正常,但有效的邮政编
我正在尝试获取每个用户的年龄。我在上面提供了示例数据。 birth_year 列是 smallint 数据类型。我怎样才能做到这一点我已经尝试了很多方法,但我以前从未使用过 PostgreSQL。 最
DB2 V9 z/os 背景:我有一个定义为 (col1 int, col2 smallint, col3 int, col4 date) 的 4 列表 第 1 行的值为 (1,123,456,201
如果我知道列的值应该始终在 smallint 数据类型允许的范围内,从数据完整性维护的角度来看,我似乎应该将数据存储在 smallint 列而不是 int 列中. 但是我想知道是否可以通过使用更少的字
我在 Java 代码中使用 PostgreSQL Plus Advance Server 9.3 和 hibernate3。所以今天我在将对象值存储到数据库时遇到了这个问题。 这是一个包含所有 set
我在 Postgres 中有一个大约 100 万行的表。此表中的一列存储 SMALLINT 数据。现在我需要在此列中存储比我预期更大的数字。如何将这个现有列从 SMALLINT 转换为 INTEGER
我的服务器提供商已经用 MariaDB 替换了 MYSQL,这似乎工作方式不同。我在运行“SHOW GLOBAL VARIABLES LIKE '%version%';”时获得的有关此服务器的信息是:
真是一个安心的问题。 我的数据库中有一个字段使用 tinyint(3) 作为整数值。我现在意识到这是低值并想将其更改为 smallint。如果我使用 phpMyAdmin 更改它,是否会影响当前数据?
最近使用mysql数据库的时候遇到了多种数字的类型,主要有int,bigint,smallint和tinyint。其中比较迷惑的是int和smallint的差别。今天就在网上仔细找了找,找到如下内容
对包含 smallint 列的表运行 select 语句并收到上述错误: SELECT * FROM [Database].[dbo].[TableName] where ColumnName = '
我正在将 SmallInt 变量与 Ord 函数的结果进行比较。示例: var MySmallInt : SmallInt; begin MySmallInt := 5; if(MySma
我是 SQL 新手!因此,如果我想将一个人的高度添加到我的表中(例如 1.86),我应该使用什么变量类型?? Tinyint 还是 Smallint? 最佳答案 你应该使用 要将::1.86 存储为人
目前,我的 MySQL 数据库中有一些表,其中我将 id 字段声明为 SMALLINT(6) 类型(这是否正确为 SMALLINT 只能到 65535 [长度为 5])。我已阅读here在整数类型下,
我在一个表中存储了 5000 本书,该表包含标题、作者、年份和 ISBN。现在我正在制作一张书评表。哪个更有效或者更好的方法是在书籍表中为 id 创建一个列并使用该 id 将书籍评论存储在评论表中,或
1) 创建表 CREATE TABLE ad_position_ad ( p_id bigint , p_name charact
我是一名优秀的程序员,十分优秀!