我的 MySQL 数据库表中有一堆列将布尔值(0 或 1)存储为 tinyint。它们默认为 0,并不意味着为空。我正在考虑将列属性设置为 NOT NULL,以便进行另一次验证检查以防万一。我想知道这是否会以增加桌子尺寸为代价。我担心的是,也许 NOT NULL 属性会为每个数据条目添加另一位?
我的数据库是新的,几乎是空的,所以当我尝试检查表的大小时,它总是给我 16kb。
我的 MySQL 数据库表中有一堆列将布尔值(0 或 1)存储为 tinyint。它们默认为 0,并不意味着为空。我正在考虑将列属性设置为 NOT NULL,以便进行另一次验证检查以防万一。我想知道这是否会以增加桌子尺寸为代价。我担心的是,也许 NOT NULL 属性会为每个数据条目添加另一位?
我的数据库是新的,几乎是空的,所以当我尝试检查表的大小时,它总是给我 16kb。
来自MySQL 文档(强调我的):
所以,相反,
NOT NULL
节省了磁盘空间,而不是花费更多。您使用的是哪个引擎?
每 8 个可为空的列最多
NULLs
占用 1 个字节。在另一个方向上,一个NULL
值可能占用更少的空间。你在说什么数据类型?另见
SET
。此数据类型允许您在最多 8 个字节的空间中放置最多 64 个布尔标志。很久以前,我认为vs的空间考虑是如此微不足道,以至于不值得花时间考虑它。我有一个经验法则:如果试探性优化(不会节省 10% 的东西(空间、速度等),那么放弃这个话题并寻找其他东西来优化。
NULL
NOT NULL
NULL, etc)
相反,我专注于使用,
NOT NULL
除非我有业务原因或可以充分利用的处理逻辑NULL
:我确实坚持在最初创建表时仔细考虑数据类型。稍后进行架构更改是很痛苦的。例子:
SMALLINT
而不是 4 字节吗INT
?(较小的可以节省磁盘空间并有助于提高速度)UNSIGNED
.CHARACTER SET
并COLLATION
正确。NULL
对比NOT NULL
_ (出于逻辑原因,不是速度或空间)