- 范式化设计
- 第一范式:每列属性都是不可再分的属性,确保每列的原子性
- 第二范式:要求实体属性完全依赖于主关键字,也就是说每一行要求有一个唯一性的业务主键
- 第三范式:表中不包含已在其它表中的非主键列,即数据不能存在传递关系,每个苏醒都跟主键有直接而不是间接关系
- 反范式设计
- 为了性能和读取效率适当违反范式设计,允许存在少量冗余数据,用空间换时间
- 查询分类描述需要三次,发现商品名称出现分类名称必然出现,那么冗余分类名称列减少查询次数
- 范式设计和反范式设计对比
- 范式设计有点修改操作较少,表大小较小,缺点是表关联多
- 反范式设计减少表关联,更好进行索引优化,缺点是数据冗余,修改数据操作较多
- 尽量使用范式设计,当实际中表关联多效率低时候,那么进行反范式设计
- 反范式设计
- 性能提升-冗余、缓存和汇总,比如单独建立汇总表,晚上跑定时任务
- 性能提升-计数器表,比如要计算网站点击数,可以单独建立一张计数器表,再优化可以将本来在一行修改点击数,拆分为多行点击数据,修改多行数据;也可以使用LongAddr,多个槽位写数据,最后汇总方式来分散写热点
- 反范式设计-分库分表中的查询,比如买卖东西,将交易信息根据用户维度和商品维度各建立一份
- 字段数据类型优化
- 满足业务情况下最小的数据类型
- 越简单越好,即可以用字符串又可以用整形,那么用整形
- 尽可能让列not null
- 整数类型:Tiyiint、smallint、int、bigint(long)
- 实数类型:Float4个字节存放,double8个字节存放,decimal允许存放65个数字,但是性能相对前面两个较慢,可以优化可以转化为整数用Bigint存储
- 字符串类型
- varchar:列更新比较少,多字节,但是定长度时候定的短更好
- char:所有值都定长或者接近某一长度,例如姓名、性别、身份证号、MD5
- blob,text,当使用时候尽量把字段拆分出一张表
- 必要时使用枚举代替字符串,比如是固定的几个字符串,数字字符串不要搞成枚举