MySQL数据类型及其优化(4)

162 阅读2分钟

这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战

猫和老鼠.jpg

前言:   本篇文章 是我关于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》