有时你可以使用ENUM列来代替通常使用的字符串类型。一个ENUM列可以存储65,535个不同的字符串值。MySQL以紧凑的方式存储它们,通过列表中值的个数来决定把它们放到1个还是2个字节中。在MySql内部是用一个integer来存储每一个值,这个integer代表其在列表中的位置,在表的.frm文件中保持一个查询表(lookup table),这个查询表定义了number-to-string的对应关系。例如:
CREATE TABLE enum_test(e ENUM('fish','apple','dog') NOT NULL);
INSERT INTO enum_test(e) VALUES('fish'),('dog'),('apple');
这3行实际存储为integers,而不是strings。you can see the dual nature of the values by retrieving them in a numeric context:
SELECT e+0 FROM enum_test;
e+0
1
3
2
当你把ENUM的常量定义为数字的时候,ENUM的这种双重特性会使你感到十分困惑,例如ENUM('1','2','3')。我们建议你不要那样做。
在排序的时候会以其内部的integer的值来进行排序,而不是通过它们的字符串值,例如:
SELECT e FROM enum_test ORDER BY e;
e
fish
apple
dog
你可以根据ENUM的这个特性来通过指定ENUM列表中各个元素的顺序使它们按照你自己的方式来进行排序。你也可以在你的查询语句中使用FIELD()来指定排序,但是这样就会阻止MySql使用索引来进行排序:
SELECT e FROM enum_test ORDER BY FIELD(e,'apple','dog','fish');
e
apple
dog
fish
ENUM最大的不足是其列表中的字符串都是确定的,只能通过ALTER TABLE来增加或者删除字符串元素。因此,这不是个好主意当使用ENUM作为一个字符串类型而其中的列表元素在未来某个时候会发生变化的时候。MySQL在它自己的权限表中使用ENUM来存储Y和N。
因为MySQL把每一个值存储为integer,所以它需要额外的开销来进行查找,并把integer转换为它们的字符串表示。This is usually offset by their smaller size,but not alwayes。连接CHAR(VARCHAR)列到ENUM列比CHAR(VARCHAR)连接到CHAR(VARCHAR)列要慢。为了说明这个,我们在我们应用程序中的一个表测试了它的性能:
CREATE TABLE webservicecalls (
day date NOT NULL,
account smallint NOT NULL,
service varchar(10) NOT NULL,
method varchar(50) NOT NULL,
calls int NOT NULL,
items int NOT NULL,
time float NOT NULL,
cost decimal(9,5) NOT NULL,
updated datetime,
PRIMARY KEY (day, account, service, method)
) ENGINE=InnoDB;
这个表包含了110,000条记录,只有10MB大小,所以可以全部放到内存中。service列有5个不同的值,平均字符长度为4个字符,method列有71个值,平均长度为20个字符。
我们复制了该表,把service和method列转换为ENUM,如下:
CREATE TABLE webservicecalls_enum (
... omitted ...
service ENUM(...values omitted...) NOT NULL,
method ENUM(...values omitted...) NOT NULL,
... omitted ...
) ENGINE=InnoDB;
我们通过主键连接两个表,并测试了性能。如下是我们的查询语句:
mysql> SELECT SQL_NO_CACHE COUNT(*)
-> FROM webservicecalls
-> JOIN webservicecalls USING(day, account, service, method);
我们使用不同的组合来连接VARCHAR和ENUM列,结果如下所示:
Speed of joining VARCHAR and ENUM columns
Test Queries per second
VARCHAR joined to VARCHAR 2.6
VARCHAR joined to ENUM 1.7
ENUM joined to VARCHAR 1.8
ENUM joined to ENUM 3.5
未完,待续......
分享到:
相关推荐
`named_enum-1.1.0.tar.gz` 是一个针对Python编程语言的库,名为 `named_enum` 的版本1.1.0的压缩包。这个库主要关注的是枚举...通过这种方式,可以使用有意义的名字代替硬编码的数字或字符串,使得代码更加清晰。
因此,对于新的项目,推荐使用TINYINT来代替ENUM,尤其是在与PHP或其他弱类型语言交互时。而对于已经使用ENUM的现有系统,若改动代价过大,可以继续使用,但应加强文档说明和代码审查,以防止因类型混淆引发的错误。
上述代码展示了如何使用`enum_name`函数获取枚举的字符串表示,以及如何使用`enum_values`函数迭代枚举的所有值。 5. **枚举的反向查找(Reverse Lookup)** 魔术枚举库还支持从字符串反向查找枚举值: ```cpp ...
**字符串类型**如 CHAR、VARCHAR、TEXT、ENUM 和 SET,它们用于存储字符数据。CHAR是固定长度的字符串,而VARCHAR是可变长度的,更节省空间。TEXT类型用于存储大量文本,ENUM和SET则分别用于存储预定义的枚举值和...
为了解决这个问题,我们可以使用枚举类型来代替整数。枚举是一种特殊的类,用于定义一组相关的常量。在本例中,我们可以创建一个名为`Orientation`的枚举: ```java public enum Orientation { HORIZONTAL(0), ...
在数据库操作中,枚举可以用来定义不同的查询类型或者操作类型,这样在处理数据库交互时,可以使用枚举值代替硬编码的字符串或数字,提高代码的可读性和可维护性。例如,定义一个`DBOperation`枚举,包含`SELECT`, `...
- 函数`verifyMsisdn`接收一个`char*`类型的参数`inMsisdn`,表示输入的手机号码字符串。 - 首先,通过`strlen`函数计算字符串长度,若长度不等于13,则直接返回1,表示长度不合法。 - 接下来,遍历字符串的每一...
- ENUM:枚举类型,一种特殊的字符串类型,其中的值必须在创建时定义的有限值中选取。 - SET:集合类型,可以包含零个或多个值,每个SET成员可以取0或1个值。 6. 其他类型: - DECIMAL:用于存储精确的小数值,...
- 字符串类型在Java中是`java.lang.String`。 - 日期/时间类型有`java.sql.Date`, `java.sql.Time`, 和 `java.sql.Timestamp`。 - 二进制数据使用`byte[]`。 - 布尔类型是`java.lang.Boolean`。 在Java应用程序...
但在使用索引后,这个优势进一步减小,整数和字符串类型的性能差距变得非常微小。 在实际开发中,尤其是处理枚举类型时,使用char(1)或char(4)字符串表示类型枚举是一种推荐的做法。这种方法不仅节省存储空间,而且...
同样,StringDef注解可以用于字符串类型的类型安全。例如: ```java public class StringEnum { public static final String MONDAY = "monday"; public static final String TUESDAY = "tuesday"; public ...
- 提高代码可读性:通过使用有意义的常量名代替魔法数字或字符串,使得代码更容易理解和维护。 - 避免硬编码:枚举可以确保常量的唯一性,减少因修改而导致的错误。 - 类型安全:枚举是一种强类型的数据结构,有助于...
10. 枚举类型和数字类型的对应:在使用ENUM类型时,实际上可以通过TINYINT类型来代替,这样可以更灵活地处理枚举值。 11. 文本和二进制大对象存储:当需要存储大量文本数据或二进制大对象时,应当考虑使用TEXT或...
应使用库函数如strcmp()来比较字符串。 11. 字符串大小比较:两个字符串相比较的大小不是单纯看字符个数,而是按照字符的字典顺序来比较。 12. C语言输入输出:C语言本身确实没有内置的输入输出语句,但提供了标准...
8. **使用ENUM代替字符串**: - ENUM类型的字段实际上存储为TINYINT,占用空间小,查询效率高。避免在ENUM中存储大字符串,以减少存储和查询成本。 9. **LIMIT 1提升效率**: - 当确定查询结果仅一行时,使用`...
在这个例子中,`myString`是一个可选字符串类型。由于它被初始化为`nil`,所以执行的结果将会是“字符串为 nil”。 #### 七、可选类型的高级用法 1. **可选链**:在Swift中,可以通过可选链(Optional Chaining)的...
8. **使用ENUM代替字符串**:ENUM类型在数据库内部存储为TINYINT,空间效率更高。避免使用占用空间大且效率低的字符串。 9. **LIMIT 1优化**:当预期结果只有一条时,使用`LIMIT 1`可以提前终止查询,提高效率。 ...
例如,用`Season.SPRING`代替数字`1`或字符串`"spring"`来表示春季。这种方式不仅提高了代码的可读性,还增强了类型安全性,避免了由于硬编码造成的错误。 **2. 扩展性和灵活性** - **枚举元素的实例性质**:枚举...
然后在`HTMLBuilder`类中使用这个枚举来代替字符串,提高代码的可读性和安全性。 总结来说,Swift提供了多种方式来生成HTML,从简单的字符串模板到复杂的类结构。选择合适的方法取决于HTML的复杂程度以及项目的需求...