我使用的是 MySQL 8.0 社区版。我有一个属性,我想在其中存储
TRUE
或 FALSE
状态,并且我希望它使用尽可能少的空间。
读完这个问题的答案后: MySQL:一位的最小数据类型和MySQL文档位值类型 - BIT和整数类型(精确值),我知道在存储级别最好使用
BIT(1)
,因为BOOL
实际上是一个 TINYINT(1)
,因此使用完整的 1 个字节。
在存储级别,显然
BIT(1)
是最佳选择,但在 性能 级别搜索 true 或 false?
如果我理解正确的话,
BIT
将存储1或0,而BOOL
存储TRUE
或FALSE
。
这种差异使得在两种可能性之间搜索时,其中一种类型可以更好地优化?
谢谢。
BIT(1)
还需要至少 1 个字节,因此与 BOOL
/TINYINT
相比,您不会节省任何空间。两者都占用 1 个字节。
与 MySQL 开发人员交谈时,当我提到
BIT
数据类型时,他们通常会皱起眉头。它充满了已知的错误,以及可能未被发现的错误。内部代码很难理解。他们告诉我只使用TINYINT
。
顺便说一下,MySQL 没有真正的
BOOL
类型。 BOOL
只是 TINYINT(1)
的别名,没有 true 或 false 值。 “假”值实际上是整数 0,“真”值是整数 1。换句话说,您可以 SUM()
假定为布尔值的列,并且得到等于行数的整数和其中该列为“true”。这不符合标准 SQL(对布尔列进行 SUM() 没有意义),但这是 BOOL
在 MySQL 中实现的方式。
考虑到mysql中的boolean与tinyint(1)相同。也就是说,布尔值总是每列使用 1 个字节,但 bit(n) 将使用保存给定位数所需的尽可能少的字节。 BIT 节省了一些空间,但是我会使用布尔值,因为它使您想要查询数据库时的事情变得更简单。如果你不小心的话,你可能会得到 0 或 1 以外的值。为了避免这种情况,您可以使用别名 TRUE 和 FALSE。
(除了比尔所说的...)
我有一条经验法则:“如果粗略估计没有表明至少有 10% 的改进,则继续进行其他优化”。再加上这样一个事实:即使一位布尔值将行长度缩小 7 位,也可能节省不到 1%。所以,我继续前进。
OTOH,如果您有很多布尔值,请考虑
SET
数据类型,它可以在 8 个字节或更短的时间内处理最多 64 个“布尔值”。但它相当笨拙。 64 位 BIGINT UNSIGNED
以及移位和布尔运算符(<<
、&
等)也有类似的情况
如果您需要
INDEX
一个或多个布尔值,请忘记它。索引起作用的唯一情况是在复合(多列)索引中,其中一列[有效] TINYINT NOT NULL