良好的逻辑设计和物理设计是高性能的基石。
1.1选择优化的数据类型
Mysql 支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。
1、更小的通常更好
一般情况下,应该尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快。
2、简单就好
简单数据类型的操作通常需要更少的 CPU 周期。(整数比字符串代价更低;整数存储IP;Mysql内建的函数存储日期和时间)
3、尽量避免null
通常情况下,通常指定列为 not null
复制代码
1.1.1 整数类型
有两种类型的数字,整数(whole number)和实数(real number),如果存储整数,可以使用这几种数据类型
数据类型 | 存储空间 | 存储值范围 |
---|---|---|
tinyint | 8 | ![]() ![]() |
smallint | 16 | ![]() ![]() |
mediumint | 24 | ![]() ![]() |
int | 32 | ![]() ![]() |
bigint | 64 | ![]() ![]() |
1.1.2 实数类型
实数是带有小数部分的数字。
应该尽量只是在对小数进行精确运算时,才使用decimal(存储财务数据),但是在数据量比较大的时候,可以考虑使用 bigint 代替 decimal ,将需要存储的数据按照小数位乘以相应的倍数即可。
1.1.3 字符串类型
- varchar
varchar 类型用于存储可变长字符串,是最常见的字符串数据类型。varchar 需要使用 1 或 2 个额外字节记录字符串的长度。
- char
char 类型是定长的,mysql 总是根据分配的字符串的长度分配足够的空间。char 适合存储很短的字符串或者所有值都接近一个长度(密码的MD5值)
- binary(固定长度字节) 和 varbinary(可变长度字节)
优势:mysql 比较 binary 字符串时,每次按一个字节,并且根据字节的值进行比较,因此,二进制比较比字符串比较简单的很多,所以也就更快。
慷慨是不明智的:varchar(5) 和 varcahr(255) 存储 'hello'的空间开销是一样的,但是更长的列消耗更多的内存,因为 mysql 通常会分配固定大小的内存块来保存内部值。所以最好的策略是只分配真正需要的空间。
1.1.4 blob and text
BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
TEXT 存放最大长度为 65,535 个字符的字符串。
尽量避免使用
1.1.5 enum 枚举
1、枚举类型实际存储为整数,而不是字符串。
2、枚举字段内部是按照内存存储的整数而不是字符串来进行排序的。
3、枚举最不好的地方是字符串列表是固定的。修改的话只能 alter table
1.1.6 日期和时间类型
datetime 和 timestamp
datatime:从1001到9999年,使用八个字节的存储空间
timestamp :表示1970 到2038年。和unix时间戳相同。使用四个字节的存储空间。timestamp 显示的值依赖于时区。
1.1.7 位数据类型
1.1.8 标识符
为标识符选择合适的数据类型非常重要
1 、整数类型:通常是最好的选择,因为他们很快并且可以使用 auto_increment
2 、enum 和 set 类型:糟糕选择,尽量避免
3 、字符串类型:避免,因为他们消耗空间,并且通常比数字慢。
如果存储 uuid 值,用 unhex() 函数转换 UUID 值为 16 字节的数字,然后存储在一个 bigint(16) 列中。检索时,根据 hex() 函数来格式化十六进制格式。
1.1.9 特殊数据类型
比如低于秒级精度的时间戳。
IP 地址。无符号整数(unsigned int)来存储。mysql 提供 inet_aton() 和 inet_ntoa() 函数来进行转换。