0

我目前在 MySQL 数据库中使用枚举作为 TINYINT。我的表中有几百万行。然后我们将枚举从 TINYINT 映射到其他地方的字符串。

我正在考虑将这些枚举存储为字符串。如果字符串被正确索引,是否有人知道 MySQL 在查询字符串枚举而不是 TINYINT 枚举时如何执行?

感谢帮助。谢谢。

4

4 回答 4

3

枚举的存储就像有一个查找表一样,因此每行只存储一个数字引用,在其他地方有一个查找表。从技术上讲,匹配枚举的整数值与匹配整数一样快,因为两者相同,匹配字符串值稍微慢一些(在所有情况下都没有),这仅仅是因为只完成了一次“搜索”,通过查找表以查找整数值,然后将其用于执行查找。

一个例子是,如果您搜索一个不存在的值,尝试将 enum 的数值匹配一个不存在的值,它仍然会搜索所有数据,但尝试匹配一个不存在的字符串值'不存在,并且在查找表中进行了较小的搜索,在搜索任何数据之前不返回匹配项。

不要将枚举用于“是/否”或“男性/女性”的答案,因为数字数据和查找表占用的空间远大于“位”值(0 或 1)。另外,不要在枚举定义中使用数字字符串,例如 enum("1","0") 因为这会让任何查看代码和查询的人感到困惑(因为存储的查找表是 [0 => "1 ", 1 => "0"]。

于 2012-03-08T21:27:22.757 回答
1

(假设您正在使用 TINYINT 并有一个查找表)TINYINT 更快,但您最终可能会因为连接而看到一些性能下降。

我的建议是,如果您的枚举值不会改变(例如 - 男性、女性类型,是的,没有枚举类型),请改用 MYSQL ENUM 字段。它使用 1 个字节存储(如果枚举值小于 255),并且不需要连接。

但是在尝试之前请注意并阅读 ENUM 数据类型的所有优缺点。

于 2011-03-13T18:39:32.137 回答
0

TINYINT(或INTEGER为此目的)索引速度更快,并且在 SORT 或 SELECT 中的性能比VARCHARor更好CHAR

所以,回答你,是的,字符串被正确索引,但性能可能会下降。我说不出那会有多重要。


编辑 1更多信息

看起来更小VARCHAR,并且INTEGER在索引方面的性能差异可以忽略不计。见这里http://forums.mysql.com/read.php?115,251611,252006#msg-252006

于 2011-01-08T21:22:33.173 回答
0

根据这些基准,枚举似乎有一点优势。

于 2011-01-08T21:25:02.390 回答