高性能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语句会变得很慢,因为逻辑上相邻的行会分布在磁盘和内存的不同地方。
- 随机值导致缓存对所有类型的查询语句效果都很差,因为会使得缓存发挥作用的访问局部性原理失效。