MySQL 8 中 BIT 或 BOOL 搜索的最佳性能

问题描述 投票:0回答:3

我使用的是 MySQL 8.0 社区版。我有一个属性,我想在其中存储

TRUE
FALSE
状态,并且我希望它使用尽可能少的空间。

读完这个问题的答案后: MySQL:一位的最小数据类型和MySQL文档位值类型 - BIT整数类型(精确值),我知道在存储级别最好使用

BIT(1)
,因为
BOOL
实际上是一个
TINYINT(1)
,因此使用完整的 1 个字节。

在存储级别,显然

BIT(1)
是最佳选择,但在 性能 级别搜索 truefalse

如果我理解正确的话,

BIT
将存储1或0,而
BOOL
存储
TRUE
FALSE

这种差异使得在两种可能性之间搜索时,其中一种类型可以更好地优化?

谢谢。

mysql database-performance mysql-8.0
3个回答
3
投票

BIT(1)
还需要至少 1 个字节,因此与
BOOL
/
TINYINT
相比,您不会节省任何空间。两者都占用 1 个字节。

与 MySQL 开发人员交谈时,当我提到

BIT
数据类型时,他们通常会皱起眉头。它充满了已知的错误,以及可能未被发现的错误。内部代码很难理解。他们告诉我只使用
TINYINT

顺便说一下,MySQL 没有真正的

BOOL
类型。
BOOL
只是
TINYINT(1)
的别名,没有 true 或 false 值。 “假”值实际上是整数 0,“真”值是整数 1。换句话说,您可以
SUM()
假定为布尔值的列,并且得到等于行数的整数和其中该列为“true”。这不符合标准 SQL(对布尔列进行 SUM() 没有意义),但这是
BOOL
在 MySQL 中实现的方式。


0
投票

考虑到mysql中的boolean与tinyint(1)相同。也就是说,布尔值总是每列使用 1 个字节,但 bit(n) 将使用保存给定位数所需的尽可能少的字节。 BIT 节省了一些空间,但是我会使用布尔值,因为它使您想要查询数据库时的事情变得更简单。如果你不小心的话,你可能会得到 0 或 1 以外的值。为了避免这种情况,您可以使用别名 TRUE 和 FALSE。


0
投票

(除了比尔所说的...)

我有一条经验法则:“如果粗略估计没有表明至少有 10% 的改进,则继续进行其他优化”。再加上这样一个事实:即使一位布尔值将行长度缩小 7 位,也可能节省不到 1%。所以,我继续前进。

OTOH,如果您有很多布尔值,请考虑

SET
数据类型,它可以在 8 个字节或更短的时间内处理最多 64 个“布尔值”。但它相当笨拙。 64 位
BIGINT UNSIGNED
以及移位和布尔运算符(
<<
&
等)也有类似的情况

如果您需要

INDEX
一个或多个布尔值,请忘记它。索引起作用的唯一情况是在复合(多列)索引中,其中一列[有效]
TINYINT NOT NULL

© www.soinside.com 2019 - 2024. All rights reserved.