MyISAM 表和 MySQL 5.1 中哪个更好,Tinyint 具有 0 和 1 值或 ENUM 0,1?
5 回答
您可以BIT(1)
按照mysql 5.1 reference中的说明使用。我不会推荐enum
或tinyint(1)
只bit(1)
需要 1 位来存储布尔值,而tinyint(1)
需要 8 位。
我的研究表明,对于 5.0.3 之前的 MySQL 版本,BIT(1) 是 TINYINT(1) 的同义词。
MySQL 5.0.3 之后的版本改变了 BIT 数据类型的工作方式。它不再是 TINYINT 的同义词,并且是唯一允许您在不到一个字节内存储任何内容的数据类型。
此数据类型可能比使用 TINYINT 或 ENUM 更可取。我计划在我的博客上测试一下哪个最快以及这三个的空间使用情况。如果您想查看大小和速度结果,底部有一个链接。测试平台:运行 OpenBSD 和 MySQL 的糟糕消费级 Pentium III 机器。(使用较慢的 DB 开发箱,您可以真正感受到不良代码的影响。此外,测试查询之间的差异更加明显。或者,尝试使用分配的资源几乎没有足够的 VM。)
MySQL 官方文档。
- v5.1 - http://dev.mysql.com/doc/refman/5.1/en/numeric-type-overview.html
- v5.6 - http://dev.mysql.com/doc/refman/5.6/en/numeric-type-overview.html
施瓦茨男爵对此有话要说。
我建议 ENUM 更可取,因为它明确了预期的内容;如果它以任何可衡量的方式降低性能,我会感到非常惊讶。要让 tinyint 完成这项工作,需要 CHECK 对列的约束;目前没有一个 MySQL 存储引擎支持这个。
枚举,在某种程度上为开发人员或程序员提供了“提示”。但通常,最好以编程方式处理它。所以不管是ENUM(0,1), BIT(1) AND TINYINT(1),都使用1个字节,在大多数情况下,在客户端处理,而不是在bit(1)中发送2会更好或 enum(0,1) 到服务器,然后服务器将返回一个您无论如何都必须处理的错误 - 使用更多资源(网络 + 服务器 CPU + 客户端 CPU x 2)
0 通常表示错误,1 表示正确。
For the best performance and space requirements you should collect your boolean values and save them in the same TINYINT. Eg. Save up to 8 boolean values in a TINYINT. 16 boolean values in a SMALLINT etc.
Both BIT(1) and ENUM uses at least 1 byte BIT(M) - approximately (M+7)/8 bytes
see: https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html. So if you are storing 1 boolean value I would use TINYINT as it has the same overhead as BIT and ENUM but gives you the option to store 7 more boolean values later if you need.