本篇文章主要是介绍MySQL中数据类型优化的方法,选择合适的数据类型对获得高性能至关重要,本文知识点总结:
- 使用小而简单的合适的数据类型,尽量不要使用NULL值
- 在关联条件的列,尽量时候使用相同的数据类型
- 使用整型来定义标识列
- 固定长度的列尽量使用char代替varchar,否则在临时表和排序的时候导致按最大长度分配内存
- 不要滥用ENUM和SET
实数类型
实数是带有小树部分的数字,Mysql有支持精确的,有不支持精确的
-FLOAT
DOUBLE
是进行近似的浮点运算
-DECIMAL
进行精确的计算,在对精度要求很高的时候才使用(比如财务数据)
字符串类型
- 在这些情况下可以使用
VARCHAR
- 列更新少;
- 使用了想UTF-8这样复杂的字符集;
- 字符串的最大长度比平均长度大很多;
CHAR
适合存储很短的字符串,比如
- 存储的是定长的数据,比如身份证号,手机号,密码,银行卡号,订单号,支付号等…
在存储字符串方面,最好的策略就是分配真正需要的空间,比如存储姓名,VARCHAR(20)
比 VARCHAR(100)
要合适。
枚举类型
有的时候会使用枚举代替常用的字符串类型,比如性别,订单状态…
- 在MySQL中枚举字段排序并不是定义的字符串排序,而是
按照内部存储的数字排序的,最好的方法就是按照字母的顺序来定义,ENUM(‘apple‘,’book’,’cook”) 避免这样使用枚举ENUM(‘1’,’2’,’3’)
日期和时间类型
1.
TIMESTAMP
显示的时间依赖于时区DATETIME
与时区无关尽量使用
TIMESTAMP
,它比DATATIME
空间效率更高
4.可以使用BIGINT
存储微妙级别的时间戳,或使用DOUBLE
存储秒后面的小数部分特殊类型的数据
某些类型的数据并不直接与内置的数据类型有关,比如IPv4,它实际上是一个32位无符号的整数,而不是字符串,MySQL提供了
INET_ATON()
INET_NTOA
进行转换