这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战
前言: 本篇文章 是我关于MySQL的第25篇文章,水平一般、能力有限。文章写的比较浅,适合新手来看。本篇文章介绍MySQL数据类型及其优化。
枚举类型
在实际使用字符串来存储数据时,类型或者是某些配置一般都是固定的几个字符串。 这个时候,我们可以用枚举类型来对字段进行限制。
首先创建枚举表
create table person(
id int NOT NULL AUTO_INCREMENT,
sex enum('man','woman') NOT NULL,
PRIMARY KEY (`id`)
);
insert into person values (null,'man'),(null,'woman');
MySQL在存储这些枚举类型时是非常紧凑的,会根据列表值的数量压缩到很少的字节中。MySQL一般会将其在枚举列中的位置(索引)存储为整数类型。并且将其关系存储在表的frm文件中。
如下文,在直接查询时显示的字段为正常的字符串类型
select sex from person;
sex |
-----+
man |
woman|
但是直接对该枚举类型的字段进行数字加减的时候,字符串类型就显示为原始保存的值了。
select sex+0 from person;
sex+0|
-----+
1 |
2 |
注意:
-
枚举最不好的地方是,字符串列表是固定的,所以设计表时,如果不确定之后是否会增加枚举中的字段。一般不要选用枚举类型。
-
因为每次往枚举类型中添加或删除字符串必须使用ALTER TABLE,这对这张表所有操作几乎就全部阻塞了。在数据量很大时对系统的性能影响是巨大的。
-
枚举类型在进行对比和实际上存储时实际上保存的是整数形式,做对比和运算时是有开销的。虽然这个开销不是很大,但是原则上,直接存储整数其实是更好的选择。
参考文档
《高性能MySQL》