mysql - 在 MySQL 中使用字符串枚举 - 性能问题

标签 mysql string enums indexing tinyint

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

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

感谢帮助。谢谢。

最佳答案

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

一个例子是如果你搜索一个不存在的值,尝试匹配一个不存在的值的枚举数值,它仍然会搜索所有数据,但是尝试匹配一个字符串不存在的值,并通过查找表进行较小的搜索,在搜索任何数据之前不返回任何匹配项。

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

关于mysql - 在 MySQL 中使用字符串枚举 - 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4636151/

相关文章:

php - MySQL Case 语句双重结果

mysql - 在不同时区检索时,mysql 中的时间戳是否被缓存?

php - 从 PHP codeigniter 模型返回的结果集中获取单个值

Java Date/Calendar 对象字符串,比较

c# - 在可移植库中将字符串转换为枚举

php - 如何存储 Bikram Sambat 日期格式?

string - Groovy:如何在不转义的情况下在字符串中包含反斜杠?

c# - 删除字符串的特定部分

java - 使用枚举类来处理用户选择(多态)

swift - 无法识别枚举的 rawValue 属性