高性能MySQL学习系列(一)--Schema与数据类型优化
1、选择优化的数据类型
TIMESTAMP和DATETIME存储时间和日期,精确到秒。TIMESTAMP只使用DATETIME一半的存储空间,并且会随时区变化,具有特殊的自动更新能力。但是TIMESTAMP的时间范围要小得多。
选择的数据类型只能决定MySQL在内存和磁盘中是怎样保存数据的,数据的计算与存储无关
1.1、整数类型
| 整数类型 |
存储空间 |
| TINYINT |
8 |
| SMALLINT |
16 |
| MEDIUMINT |
24 |
| INT |
32 |
| BIGINT |
64 |
1.2、实数类型
| 实数类型 |
存储空间 |
| FLOAT |
32 |
| DOUBLE |
64 |
| DECIMAL |
动态的。可以指定小数点前后的最大位数,每4个字节存储9个数字,小数点占一个字节 |
DECIMAL只是一个“存储类型”,其运算依赖于具体实现。MySQL4.1以及更早的版本使用浮点运算来实现DECIMAL的运算,在MySQL5.1及更高的版本中,服务器自身实现了DECIMAL的高精度计算。相对而言,CPU直接支持原生浮点运算,所以浮点运算明显更快。 |
|
1.3、字符串类型
|
VARCHAR |
CHAR |
| 空间大小 |
字符串本身存储空间加额外的1或2字节的字符串长度信息 |
固定大小 |
| 字符串列的最大长度比平均长度大很多 |
适用 |
不适用 |
| 列更新频繁 |
适用 |
不适用 |
| 使用变长编码的字符集,如utf-8 |
适用 |
不适用 |
| 末尾空格 |
保留 |
不保留 |
| 列的长度短 |
不适用 |
适用 |
1.4、日期和时间类型
|
DATETIME |
UNIXTIME |
| 表示范围 |
1001~9999 |
1970~2038 |
| 存储空间 |
8个字节 |
4个字节 |
| 时区 |
无关 |
有关 |
1.5、位数据类型
1.6、扩展
随机产生的字符串,如UUID,MD5,SHA1等,会分布在很大的空间内,导致INSERT以及SELECT语句变得很慢:
- 因为插入的值会随机地写到已有索引中的任意位置,导致页分裂、磁盘随机访问,以及对于聚簇存储引擎产生聚簇索引碎片。
- SELECT语句会变得很慢,因为逻辑上相邻的行会分布在磁盘和内存的不同地方。
- 随机值导致缓存对所有类型的查询语句效果都很差,因为会使得缓存发挥作用的访问局部性原理失效。