繁体   English   中英

MySQL 中布尔值的 TINYINT 与 ENUM(0, 1)

[英]TINYINT vs ENUM(0, 1) for boolean values in MySQL

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

您可以使用mysql 5.1 参考中提到的BIT(1) 我不会推荐enumtinyint(1)因为bit(1)只需要 1 位来存储布尔值,而tinyint(1)需要 8 位。

我的研究表明,对于 5.0.3 之前的 MySQL 版本,BIT(1) 是 TINYINT(1) 的同义词。

5.0.3 之后的 MySQL 版本更改了 BIT 数据类型的工作方式。 它不再是 TINYINT 的同义词,而是唯一允许您以少于一个字节存储任何内容的数据类型。

这种数据类型可能比使用 TINYINT 或 ENUM 更可取。 我计划在我的博客上进行测试,看看哪个最快,以及这三个的空间使用情况。 如果您想查看大小和速度结果,底部有一个链接。 测试平台:运行 OpenBSD 和 MySQL 的糟糕的消费级 Pentium III 机器。 (使用较慢的 DB 开发框,您可以真正感受到糟糕代码的影响。此外,测试查询之间的差异更明显。或者,尝试使用分配了几乎没有足够资源的 VM。)

MySQL 官方文档。

Baron Schwartz 对此有话要说。

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

枚举,在某种程度上为开发人员或程序员提供了“提示”。 但通常,最好以编程方式处理它。 所以不管是ENUM(0,1), BIT(1) AND TINYINT(1),都用1个字节,大多数情况下在客户端处理会更好,而不是在bit(1)中发送2或 enum(0,1) 到服务器,然后服务器将返回一个错误,您无论如何都必须处理 - 使用更多资源(网络 + 服务器 CPU + 客户端 CPU x 2)

0 通常表示假,1 表示真。

我建议 ENUM 更可取,因为它清楚地表明了预期; 如果它以任何可衡量的方式降低性能,我会感到非常惊讶。 要让 tinyint 完成这项工作,需要检查列上的约束; 目前没有任何 MySQL 存储引擎支持这一点。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM