基于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;