MySql优化(一)如何选择数据类型

- 选择合适的数据类型

在创建初期数据类型的选择非常重要,错误的数据类型会导致资源的浪费和检索的速度,如何选择数据类型重点在合适二字。如何选择呢先让我们看看不同的类型介绍

类型介绍

整数

TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT 分别是 8 ,16,24,32,64位储存空间 范围从-2n-1 到 2n-1 -1N是空间位数
整数类型有UNSIGNED属性 表示不许有负值 这可以提高正数上线比如 TINYINT.UNSIGNED可以存储0-255,而不加UNSIGNED
范围是-128至127
补充知识 int(1)和int(10)储存空间是一样的 数字只是限制合法范围

实数

实数是带有小数部分的数字,然而不只是为了储存小数部分 也可以使用DECIMAL 储存比 BIGINT更大的数字
FLOAT比DOUBLE 运算更快(因为CPU支持原生浮点计算)

字符串类型

varchar用于储存可变长字符串,它比定长类型更节省空间,因为它仅使用必要的空间
char类型是定长的 CHAR适合储存很短的字符串或者所有值都接近一个长度的 例如MD5加密密码。对于经常变更的数据CHAR也比VARCHAR 更好 因为定长类型不易产生碎片。
BLOB和TEXT类型都是为大数据而设计 分别用二进制和字符方式储存 当BLOB和TEXT值太大时 InnoDB会使用专门的外部储存区进行储存

枚举

ENUM(不常用)有时候可以用枚举代替常用字符串类型。枚举列可以把不重复的字符串储存成一个集合 MYSQL 在储存枚举时很紧凑 会值压缩到一两个字节中

日期类型

DATETIME 这个类型能保存大范围的值从1001年到9999年,精度为秒
TIMESTAMP这个类型保存范围197011到2038年 并且提供了UNIX_TIMESTAMP函数转换时间戳

位数据类型

BIT(不建议使用)
BIT和TINYINT同义词 MYSQL把BIT类型当成字符串而不是数字类型 数据插入bit类型字段时,先转换为二进制 当向bit(1)的col1列插入2时,由于2的二进制表示为10,需要两位,所以插入失败。将col1改为bit(2)即可插入成功 BIT类型,用于存放位字段类型 直接使用select是无法看到bit类型的内容的 可以用bin()或hex()函数进行读取
SET多选字符串数据类型
适合存储“多个值”。 字段名称 SET(“选项1”,“选项2”,…,‘选项n’) 它在Mysql内部是以一系列打包的位的集合来表示 这样有效的利用了储存空间 它的缺点是 改变列定义代价高 在SET里也没办法用索引查询

标识列的注意事项

整数类型
整数通常是标识列最好的选择 因为他们很快 并且可以使用AUTO_INCREMENT
ENUM和SET类型
对于标识列来说ENUM和SET类型不是很好的选择 只适合储存固定信息
字符串类型
尽量不要选择字符串来当标识列因为他们消耗空间且比数字慢 如果非要用请转换为16字节数字 储存在BINARY(16)列中 UNHEX()转换 HEX()转回

总结

用合适的储存类型 例:如IP 192.168.1.111人们经常使用varchar来储存。然而他是32位无符号整数 至于加点是为了让大家容易理解 所以应该用无符号储存IP MYSQL提供INET_ATON() 和 INET_NTOA函数转换
在不超出储存大小范围内 尽量选择最小的数据类型 (因为小类型占用磁盘 内存 CPU缓存更少)
类型越简单越好 (整型比字符串操作代价低)
避免NULL值除非真的需要 (在索引统计和值对比都更复杂 当建立索引时 每个索引都需要额外的字节)通常改为not null (MyISAM 真的不建议有NULL) 如果引擎为(InnoDB的话相对好一些 因为有单独的位储存NULL)

你可能感兴趣的:(Mysql,mysql)