良好的逻辑设计和物理设计是高性能的基石,选择正确的数据类型对于获得高性能至关重要。
简单的原则:
- 更小的通常更好。应该尽量使用可以正确存储数据的最小数据类型。
- 简单更好。简单数据类型的操作通常需要更少的CPU周期。
- 尽量避免NULL。
整数类型:
TINYINT | 8bit |
---|---|
SMALLINT | 16bit |
MEDIUMINT | 24bit |
INT | 32bit |
BIGINT | 64bit |
支持UNSGINED属性,表示有无符号。
实数类型:
DECIMAL | |
---|---|
FLOAT | 32bit |
DOUBLE | 64bit |
MySql使用DOUBLE作为内部浮点计算的类型
浮点数表示:符号部分+指数部分+尾数部分
定点数表示:10进制分割存储
可以考虑使用BIGINT代替DECIMAL
**
字符串类型:
VARCHAR
- 用于存储可变长字符串,仅使用必要的空间
- 需额外使用1或2个字节计算字符串的长度
-
CHAR
存储定长字符串
- 根据需要采用空格进行填充以方便比较
-
BINARY和VARBINARY
二进制比较的优势并不仅仅体现在大小写敏感上。MySql比较BINARY字符串时,每次按一个字节,并且根据该字节的数值进行比较。因此,二进制比较比字符串比较简单很多,所以也就更快。
BLOB和TEXT
二者都是为存储很大的数据而设计的字符串数据类型
- BLOB存储的是二进制数据,没有排序规则或字符集
- MySql把每个BLOB和TEXT值当作一个独立的对象处理。存储引擎在存储时通常会做特殊处理
- MySql讲二者的前max_sort_length字节做排序
日期和时间类型:
DATETIME
8个字节,表示1001年到9999年,精度为秒,把日期和时间封装到格式为YYYYMMDDHHMMSS的整数中,与时区无关。
TIMESTAMP
4个字节,表示从1970年1月1日午夜(格林尼治时间)以来的秒数,1970年到2038年,显示的值依赖时区。
特殊属性:
- 默认情况下,如何插入时没有指定第一个TIMESTAMP列的值,MySql则设置这个列的值为当前时间
- 在插入一行记录时,MySql默认也会更新第一个TIMESTAMP列的值(除非显示指定)
- TIMESTAMP默认为NOT NULL
位数据类型:
BIT
可以使用BIT列在一列中存储一个或多个true/false值。BIT列的最大长度为64
SET