基于schema 和数据类型优化mysql 性能
关于数据类型和值
- 长度更小的通常更好
- 类型越简单的越好(比如数字类型的复杂度通常比varchar更快)
- 尽量不要使用null(虽然会走索引但是会影响sql索引的效率)
字符类型
类型 |
场景 |
特点 |
varchar |
如文章/标题,等长度差异大的类型 |
varchar(5) 和varchar(255) 保存同样的内容存储空间相同,但是内存空间不同,因为内存空间是4k对齐的 |
char |
长度一致的内容 |
自动去除空格,最大长度为255,检索效率 和 插入效率都比varchar高,但是会存在更多的空间占用,如char(255) 不管有没有写255 都会占用255个字节 |
text/blob |
存储大字符串 |
一般不怎么用,因为数据库存储这种大字符串效率不高,完全可以写到文件系统中,然后数据库中存储文件系统的地址 |
时间类型
类型 |
占用空间 |
特点 |
datetime |
5字节 |
可保存到毫秒 |
timestamp |
4字节 |
精确到秒,但是存在一个问题 时间到2038年就用完了(工作中用的最多) |
date |
3字节 |
只能存日期 |
枚举类型
- 类似java里的枚举类型
- 在业务中经常会做一件事,设置 1,2,3,4,5 对应不同的业务类型 如1: 男 2:女 3:未知 4:保密
- mysql 中查询/插入 枚举类型时 ,底层插入的其实是一个数字,只不过你在查询/插入时,mysql 会做一层转换,这么做的好处1:增加可读性 2:防止插入某些脏数据 比如业务规定1-5,然后意外的插入了一个6
- 具体代码如下
-- 创建表 设置枚举类型
create table enum_test (
column_enum enum('男','女','其他') not null default '其他'
);
-- 修改枚举类型
alter table enum_test
modify column_enum enum ('男', '女', '其他', '啦啦啦') default '其他' not null;