MySQL ENUM VS INT

2022-08-30 23:24:23

我有几个表的列可以是类型或类型。我倾向于始终使用整数类型,假设基于它执行搜索会更快。ENUMINT

例如,我的一个表有一列:它只能有 4 个可能的值:、 、 、 。StatusTypeCompletedIn ProgressFailedTodo

我没有将上面存储为字符串,而是将它们存储为:ENUM

1分别。然后在我的PHP代码中,我有常量变量来定义这些值,如下所示:234

define('COMPLETED', 1);
define('IN_PROGRESS', 2);
define('FAILED', 3);
define('TODO', 4);

现在我的问题是,我是否以正确的方式做了,或者我应该将其更改为类型并使用字符串在查询中进行比较?我还有许多其他列只能具有最大可能值的集合。ENUM4-5


答案 1

枚举值在MySQL中看起来很酷,但我不是它们的粉丝。它们限制为 255 个值,因此,如果您决定添加更多值,则可能会遇到限制。此外,如前所述,您需要将应用程序代码中的值与数据库中的值同步 - 这似乎有潜在的危险。

此外,它们使未来的某些变化更加困难。例如,其他数据库不支持枚举。而且,如果要添加多语言支持,则在数据库中的数据类型定义中嵌入代码有点难以处理。

更标准的方法是一个或多个参考表,您可以在其中获取值。可以使用混合方法,在数据库中使用引用表。然后,可以将引用表加载到应用程序中,以获取从数字到字符串的映射,从而避免代码中的联接。join


答案 2

你说对了一半。从性能角度来看,枚举非常糟糕:MySQL枚举性能优势?

也就是说,将 s 的定义绑定到代码中也不是一件好事。理想情况下,如果要遵循正确的数据规范化模式,则还应在另一个表中定义数据库中的 s 值,并使用定义的索引作为赋值的值。INTINT

请参见: http://en.wikipedia.org/wiki/Database_normalization#Normal_forms

这样做的原因是,数据是可移植的,并且无需代码库读取即可使用(您可以通过执行联接轻松转储 Excel 的 CSV)。

神速。

示例 SQL:

SELECT *, state.name AS state FROM students
JOIN states ON student.state_id = states.id

只是为了获得州名称。

或过滤:

SELECT * FROM students
JOIN states ON student.state_id = states.id
WHERE state.name = 'Maine' OR state.code = 'ME'

是的,奇怪的例子,但这个想法是s是微小的,并且是...变量。。。存储“缅因州”而不是“16”加起来超过数百万行。此外,索引速度比 快得多,因此您的查找速度会快得多。特别是如果您天生提前知道数字,并在没有.作为一种常见的做法,这是不可取的,但如果你想更快地做一些事情,并且可以确保假设值的有效性,则可以这样做。INTVARCHARINTVARCHARJOIN


推荐