MySQL8在搜索BIT和BOOL之间的最佳性能

esyap4oy  于 2022-09-18  发布在  Java
关注(0)|答案(3)|浏览(219)

我使用的是MySQL8.0CE。我有一个属性,我想在其中存储True或False状态,并且我希望它使用尽可能少的空间。

在阅读了问题MySQL: Smallest datatype for one bit和MySQL文档Bit-Value Type - BITInteger Types (Exact Value)中的答案后,我明白在存储级别使用位(1)更好,因为BOOL实际上是TINYINT(1),因此使用完整的1字节。

在存储级别,很明显,位(1)是最好的选项,但是,在性能级别,当搜索真或假时?

如果我理解正确,BIT将存储1或0,而BOOL存储TRUE或FALSE。

这种差异使得在两种可能性之间进行搜索时,其中一种类型更适合它?

谢谢。

iqih9akk

iqih9akk1#

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

与MySQL开发人员交谈时,当我提到BIT数据类型时,他们通常会退缩。它充满了已知的漏洞,也可能是未被发现的漏洞。内部代码很难理解。他们告诉我只用TINYINT就行了。

顺便说一句,MySQL没有真正的BOOL类型。BOOL只是TINYINT(1)的别名,没有真或假值。“FALSE”值是字面上的整数0,而“TRUE”值是整数1。换句话说,您可以SUM()一个假定为布尔值的列,并得到一个等于该列为“true”的行数的整数和。这不符合标准的SQL(对布尔列执行sum()没有任何意义),但这是在MySQL中实现BOOL的方式。

njthzxwz

njthzxwz2#

认为在MySQL中Boolean与tinyint(1)相同。也就是说,布尔值总是每列使用1个字节,但位(N)将使用保存给定位数所需的尽可能少的字节。位节省了一些空间,但是我会使用Boolean,因为在您想要查询数据库的时刻,它使事情变得更简单。在术语中,如果您不小心,您可以使用非0或1的值。为了避免这种情况,您可以使用别名True和False。

xfb7svmp

xfb7svmp3#

(除了比尔所说的……)

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

如果您有很多布尔值,那么可以考虑SET数据类型,它可以在8个字节或更少的字节中处理多达64个“布尔值”。但它相当笨拙。BIGINT UNSIGNED的64位以及移位和布尔运算符(<<&等)也是如此。

如果你需要计算一个或几个布尔值,那就算了。索引有效的唯一情况大约是在复合(多列)索引中,其中一列是[有效的]TINYINT NOT NULL

相关问题