哪一个更好,Tinyint在MyISAM表和MySQL 5.1中有0和1值或ENUM 0,1?
答案 0 :(得分:25)
您可以使用mysql 5.1 reference中提到的BIT(1)
。我不会推荐enum
或tinyint(1)
因为bit(1)
只需要1位用于存储布尔值,而tinyint(1)
需要8位。
答案 1 :(得分:4)
我的研究表明,对于5.0.3之前的MySQL版本,BIT(1)是TINYINT(1)的同义词。
5.0.3之后的MySQL版本改变了BIT数据类型的工作方式。它不再是TINYINT的同义词,并且是唯一允许您以少于一个字节存储任何内容的数据类型。
此数据类型可能更适合使用TINYINT或ENUM。我计划在我的博客上进行测试,以查看哪个最快,以及三者的空间使用情况。如果你想看到尺寸和速度的结果,底部有一个链接。 Testbed:运行OpenBSD和MySQL的消费级Pentium III盒子。 (使用较慢的DB开发框,您可以真正感受到错误代码的影响。此外,测试查询之间的差异更加明显。或者,尝试使用分配了足够资源的VM。)
MySQL官方文档。
Baron Schwartz对此有所说明。
答案 2 :(得分:1)
我建议ENUM更可取,因为它可以清楚地说明预期的结果;如果它以任何可衡量的方式降低性能,我会非常惊讶。要做一个tinyint,这项工作需要检查列的约束;目前没有任何MySQL存储引擎支持此功能。
答案 3 :(得分:1)
Enum在某种程度上为开发人员或程序员提供了“提示”。但通常情况下,以编程方式处理它会更好。 因此无论是ENUM(0,1),BIT(1)还是TINYINT(1),都使用1个字节,在大多数情况下,在客户端处理更好,而不是在位(1)中发送2或枚举(0,1)到服务器,然后服务器将返回一个你将不得不处理的错误 - 使用更多的资源(网络+服务器CPU +客户端CPU x 2)
0通常表示错误, 1是的。
答案 4 :(得分:0)
为获得最佳的性能和空间要求,应收集布尔值并将其保存在同一TINYINT中。例如。在TINYINT中最多保存8个布尔值。 SMALLINT等中的16个布尔值
BIT(1)和ENUM都使用至少1个字节094482018-07-10 022 14012 000 0 30000A 002290{
059412018-07-10 022 14013 000 0 30000A 002290{
015172018-07-10 046 17502 000 0 30000A 001699I
015172018-10-25 046 17502 000 0 30000A 001699I
,请参见:https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html。因此,如果您要存储1个布尔值,那么我将使用TINYINT,因为它与BIT和ENUM的开销相同,但是如果需要,可以选择以后再存储7个布尔值。