高性能MySQL学习系列(一)--Schema与数据类型优化

高性能MySQL学习系列(一)--Schema与数据类型优化

1、选择优化的数据类型

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

高性能MySQL学习系列(一)--Schema与数据类型优化

上一篇:C# Winform 未能加载文件或程序集"System.Data.SQLite"或它的某一个依赖项。试图加载格式不正确的程序


下一篇:C#中DBNull.Value和Null的用法和区别