我目前在 MySQL 数据库中使用枚举作为 TINYINT。我的表中有几百万行。然后我们将枚举从 TINYINT 映射到其他地方的字符串。
我正在考虑将这些枚举存储为字符串。如果字符串被正确索引,是否有人知道 MySQL 在查询字符串枚举而不是 TINYINT 枚举时如何执行?
感谢帮助。谢谢。
枚举的存储就像有一个查找表一样,因此每行只存储一个数字引用,在其他地方有一个查找表。从技术上讲,匹配枚举的整数值与匹配整数一样快,因为两者相同,匹配字符串值稍微慢一些(在所有情况下都没有),这仅仅是因为只完成了一次“搜索”,通过查找表以查找整数值,然后将其用于执行查找。
一个例子是,如果您搜索一个不存在的值,尝试将 enum 的数值匹配一个不存在的值,它仍然会搜索所有数据,但尝试匹配一个不存在的字符串值'不存在,并且在查找表中进行了较小的搜索,在搜索任何数据之前不返回匹配项。
不要将枚举用于“是/否”或“男性/女性”的答案,因为数字数据和查找表占用的空间远大于“位”值(0 或 1)。另外,不要在枚举定义中使用数字字符串,例如 enum("1","0") 因为这会让任何查看代码和查询的人感到困惑(因为存储的查找表是 [0 => "1 ", 1 => "0"]。
(假设您正在使用 TINYINT 并有一个查找表)TINYINT 更快,但您最终可能会因为连接而看到一些性能下降。
我的建议是,如果您的枚举值不会改变(例如 - 男性、女性类型,是的,没有枚举类型),请改用 MYSQL ENUM 字段。它使用 1 个字节存储(如果枚举值小于 255),并且不需要连接。
但是在尝试之前请注意并阅读 ENUM 数据类型的所有优缺点。
TINYINT
(或INTEGER
为此目的)索引速度更快,并且在 SORT 或 SELECT 中的性能比VARCHAR
or更好CHAR
。
所以,回答你,是的,字符串被正确索引,但性能可能会下降。我说不出那会有多重要。
编辑 1更多信息
看起来更小VARCHAR
,并且INTEGER
在索引方面的性能差异可以忽略不计。见这里http://forums.mysql.com/read.php?115,251611,252006#msg-252006
根据这些基准,枚举似乎有一点优势。