开个新坑,也算是自己重新梳理一遍mysql优化的知识点
文章目录
- 数据类型优化
- 一、更小的通常更好
- 二、简单就好
- 三、尽量避免null
- 四、实际类型-整型
- 五、字符字符串类型
- varchar 变长字符串
- char
- 六、字符型BLOB/TEXT
- 七、时间戳
- datetime
- timestamp
- date
- 枚举类
- 补充知识点(字符集的选择)
数据类型优化
一、更小的通常更好
varchar(x(x<255)) 与 varchar(255)保存同样的内容,磁盘存储空间相同,但是内存占用不同
(尽量使用能满足条件小的数据)
二、简单就好
类似于复杂的数据类型,可以将其转换成简单的数据类型存储。比如ip地址,可以使用INET_ATON(‘ip地址’)进行转义存储,存储空间降下来了,但是也会降低数据库可读性,这个需要权衡一下进行使用
三、尽量避免null
尽量不要允许列为null,null列会让索引统计啥的比较困难
四、实际类型-整型
TINYINT\SMALLINT\MEDIUMINT\INT\BIGIND
8位 \ 16位 \24位 \32位\64位
尽量使用能够满足业务需求的最小的数据类型
五、字符字符串类型
varchar 变长字符串
1.使用最小的需求长度
2.varchar(n) n<=255时使用一个字节保存数据,n>255时会使用额外两个字节保存数据
3.varchar(x(x<255)) 与 varchar(255)保存同样的内容,磁盘存储空间相同,但是内存占用不同
4.varchar在mysql5.6之前,从255一下变成255以上时,会导致锁表
应用场景
1.存储长度波动大
2.字符串更新少
3.多字节字符(汉字特殊字符)
char
1.char会自动删除字符结尾的空格(有坑,留神勿踩)
2.最大长度255
3.检索效率,写效率比varchar高
应用场景
1.存储长度波动不大的数据,比如md5摘要
2.存储短字符串,经常更新的字符串
六、字符型BLOB/TEXT
mysql当中将blob和text当对象存储,分别以二进制和字符等形式编辑
应用场景
一般不建议使用,假如使用,建议独立分表,不影响主表的查询效率(文本等信息不如直接整个文档写进去,上传服务器或者云厂商,存个文档地址)
七、时间戳
datetime
1.8字结
2.与时区无关
3.毫秒级别精度
4.可保存时间范围大
timestamp
1.4字节
2.时间范围 1970-01-01到2038-01-19
3.精确到秒
4.采用整型存储
5.依赖数据库时区
6.自动更新timestamp值
date
1.3字节
2.使用date类型可以使用日期函数进行日期之间的计算
3.date类型用于保存1000-01-01到9999-12-31之间的日期
枚举类
使用枚举类型代替字符串,Mysql存储enum类型会非常紧凑(底层存储的就是整型1-n)
补充知识点(字符集的选择)
1.utf8 根据不同的范围进行不同字节数存储 mysql设置utf8只能存储2字节的中文,3字节等会乱码,建议换utf8mb4
2.纯拉丁字母能表示的内容,没必要选择latin1之外的其他字符编码,因为这样会节省大量存储空间