在MySQL中,布尔值的TINYINT和ENUM(0,1)哪个更好?

31

在MyISAM表和MySQL 5.1中,Tinyint的0和1值与ENUM 0,1哪个更好?


1
你所说的更好、更快、更少的存储、最快的访问和最快的写入行是什么意思?你的问题过于模糊,无法正确回答。 - Adrian Cornish
5个回答

26

你可以使用在mysql 5.1 参考文档中提到的BIT(1)。我不建议使用enumtinyint(1),因为bit(1)只需要1位来存储布尔值,而tinyint(1)需要8位。


1
我追求的是性能而非空间。你认为比特索引比tinyint或枚举键更快吗? - Wiliam
2
如果您计划在这样的列上创建索引,可能会令您失望。这种列的差异性通常非常差,即使存在索引,也会使用全表扫描。 - Brian Hooper
1
大多数Mysql管理器将BIT(1)视为布尔值,我使用BIT(1)、TINYINT和ENUM对500K个值进行了一些基准测试,结果表明BIT(1)和TINYINT具有相同的性能,但如果表中有多个BIT(1)列,则出于存储原因最好选择BIT(1)。 - Wiliam
11
MySQL仍会为位字段分配一个字节的存储空间。不同之处在于,多个位字段将重复使用该字节,直到其充满为止,而tinyint()每个tinyint使用一个字节。 - Marc B
1
@William:Brian Hooper是正确的 - 如果数据的基数很低,那么价值就很小。例如:50%为零/等等 - 索引无法帮助 ;) - OMG Ponies
显示剩余7条评论

4
我的研究表明,在MySQL 5.0.3之前的版本中,BIT(1)是TINYINT(1)的同义词。
MySQL 5.0.3之后的版本改变了BIT数据类型的工作方式。它不再是TINYINT的同义词,并且是唯一允许您在少于一个字节的情况下存储任何内容的数据类型。
与使用TINYINT或ENUM相比,这种数据类型可能更可取。我计划在我的博客上测试三者的速度和空间使用情况。如果您想查看大小和速度结果,请参阅底部链接。测试平台:运行OpenBSD和MySQL的低端Pentium III桌面电脑。 (使用速度较慢的数据库开发框,您可以真正感受到糟糕代码的影响。此外,测试查询之间的差异更加明显。或者,尝试使用VM分配了几乎没有足够资源的情况。)
MySQL官方文档。

Baron Schwartz对此有所阐述。

http://www.xaprb.com/blog/2006/04/11/bit-values-in-mysql/


1
Enum在某种程度上为开发人员或程序员提供了“提示”。但通常最好通过编程来处理它。因此,无论是ENUM(0,1),BIT(1)和TINYINT(1),都使用1个字节,在大多数情况下,最好在客户端处理,而不是发送2位于bit(1)或enum(0,1)的服务器,然后服务器将返回一个错误,您仍然必须处理-使用更多资源(网络+服务器CPU +客户端CPU x 2)
0通常表示假, 1表示真。

1
我建议使用ENUM,因为它清楚地表明了期望的内容;如果它以任何可衡量的方式影响性能,我会非常惊讶。要使tinyint起到这个作用,需要在列上添加CHECK约束;目前MySQL存储引擎都不支持此功能。

1
如果你正在考虑使用ENUM,请先阅读以下内容:http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ 和 https://dba.stackexchange.com/questions/6962/advantages-and-disadvantages-to-using-enum-vs-integer-types - But those new buttons though..

1
为了达到最佳的性能和空间要求,您应该收集布尔值并将它们保存在同一个TINYINT中。例如,在TINYINT中保存最多8个布尔值,在SMALLINT中保存16个布尔值等等。BIT(1)和ENUM都使用至少1字节BIT(M) - 大约(M+7)/8字节,请参见:https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html。因此,如果您只存储1个布尔值,我建议使用TINYINT,因为它与BIT和ENUM具有相同的开销,但如果需要,您可以随后存储7个以上的布尔值。

如果需要的话,您可以随时更改列的数据类型。使用更严格的类型可以阻止插入错误数据。此外,如果您需要,该选项还可以为您提供在以后存储7个布尔值的选择。 - dolmen
@dolmen 这肯定是数据库管理员的观点;-) 作为开发人员,我的代码会处理这个规则,我更喜欢自由地在需要时添加额外的布尔值。 - Jens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接