《高性能MYSQL》读书笔记-数据类型优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29994609/article/details/52304456

选择优化的数据类型

选择数据类型的原则

  1. 更小的通常更好
  2. 简单就好
  3. 尽量避免NULL

整数类型

  1. 可选的整数类型有:TINTINT,SMALLINT,MEDIUMINT,INT,BIGINT.
  2. 他们分别使用:8,16,24,32,64位存储空间。
  3. 他们的范围是:-2(N-1)到2(N-1),其中N是存储空间位数。
  4. 整数类型有可选的UNSIGNED(无符号)属性,这可以使正数的上限提高一倍。
  5. 整数计算一般使用64位的BIGINT,即使你指定的是TINTINT。
  6. MYSQL可以指定整数类型的宽度,如INT(11),但其实并没有什么卵用,他只是规定了MYSQL的一些交互工具用来显示字符的个数,并不限制真实的长度。

实数类型

  1. 实数分为三种类型,DECIMAL,FLOAT,DOUBLE。
  2. DECIMAL用于储存精确的小数。
  3. DECIMAL,FLOAT,DOUBLE都可以指定精度,但对于浮点类型,不建议指定精度。
  4. DECIMAL可以指定小数点前后所允许的最大位数。
  5. FLOAT储存使用4个字节,DOUBLE储存使用8个字节,DECIMAL存储同样范围的值要比浮点类型高些。

字符串类型

VARCHAR
1. VARCHAR用于储存变长字符串,他比定长更节省空间,因为他仅使用必要的空间。
2. VARCHAR需要使用1或2个额外的字节记录字符串长度:如果列的最大长度小于或等于255个字节,则使用1个字节表示,否则使用2个字节表示。
3. VARCHAR节省了空间,所以对性能也有帮助,但是由于是变长的,UPDATE时可能更长,这就导致需要做额外的工作。
4. VARCHAR(5)和VARCHA(100)存储空间开销是一样的,但是更长的列会消耗更多的内存。

CHAR
1. CHAR类型是定长的,MYSQL总是根据定义的字符串长度分配住够的空间。
2. 当储存CHAR值时,MYSQL会删除所有的末尾空格。
3. CHAR适合储存很短的字符串或定长字符串。

BLOB和TEXT
1. BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符串的方式存储。
2. BLOB家族:TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB。
3. TEXT家族:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT。
4. 前缀不同表示存储的最大大小不同,Tiny最大255,无前缀最大65K,Medium最大16M,Long最大4G。
5. 存储引擎会对此做特殊处理,当值太大时,MYSQL会存储1-4的字节的指针,并用指针指向外部实际储存值的区域。
6. BLOB和TEXT家族仅有的不同是BLOB存储的是二进制数据,没有排序规则与字符集,而TEXT有。
7. BLOB和TEXT的排序与其他是不同的,他只对每个列的最前max_sort_length字节,而不是整个字符串做排序。
8. BLOB和TEXT也不能将其全部长度的字符串进行索引。

使用枚举(ENUM)代替字符串类型
1. 枚举可以把一些不重复的字符串储存成一个预定义的集合。
2. MYSQL存储枚举时非常紧凑,在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”映射关系的“查找表”。因此在实际储存时存储的是整数,而不是字符串。
3. 枚举是按照内部存储的整数进行排序的。
4. 枚举的字符串列表是固定的,添加或删除字符串必须使用ALTER TABLE。
5. 为毛我不直接在系统中使用枚举- -!

日期和时间类型

MYSQL保存时间的类型有:YEAR,DATE,TIMESTAMP,DATETIME,他们的区别是:

日期类型 存储空间 日期格式 日期范围
datetime 8bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~9999-12-31 23:59:59
timestamp 4bytes YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01~2038-12-31 23:59:59
date 3bytes YYYY-MM-DD 1000-01-01~9999-12-31
year 1bytes YYYY 1901~ 2155

timestamp显示的值依赖于时区,且timestamp在插入时,若没有指定值,则默认设置此列的值为当前时间,默认为NotNull。
通常应该尽量使用timestamp。

猜你喜欢

转载自blog.csdn.net/qq_29994609/article/details/52304456
今日推荐