MySQL调优-01反范式化表设计
数据库设计三范式
- 第一范式(1NF)。确保数据库表的每一列都是不可分割的原子数据项,即列中不可包含数组、记录等非原子数据项;确保表中没有重复的属性或列,每个属性只出现一次,以避免数据冗余;表应该具有一个唯一标识每行的主键,用于确保数据的唯一性和引用。
- 第二范式(2NF)。在第一范式的基础上,要求所有非主键字段完全依赖于主键,不能产生部分依赖。这意味着表中的每个实例或记录必须可以被唯一地区分,选取一个能区分每个实体的属性或属性组作为实体的唯一标识。
- 第三范式(3NF)。在第二范式的基础上,要求非主键字段只依赖于主键,不依赖于其他非主键。这消除了非主属性对主属性的传递函数依赖,确保了表中的列都和主键直接相关,而不是间接相关。
反范式化设计
- 范式越高,表设计越精简,冗余越低。
- 所谓反范式化设计就是违反范式要求,为了提高性能和读取效率就要允许有冗余字段,也就空间换时间的概念。
缓存
简单的数据冗余。
统计
- 比如用户消息次数统计,需要一个消息记录表,每次查询都要count。反范式化设计可以在user表中创建列来记录消息发送次数。
- 报表,日报表,月报表等也是反范式化设计。
计数器表设计
反范式化设计提高高并发情况下优化效率,比如网站点击次数、下载次数等;
这种情况下可以多创建一列slot,每次插入随机选择slot来执行update操作,统计的时候只需要sum操作,这样就提高了并发率。
范式和反范式对比
范式化设计 | 反范式化设计 | |
---|---|---|
更新操作 | 快 | 慢 |
数据重复度 | 低 | 高 |
内存占用 | 低 | 高 |
查询表关联 | 多 | 少 |
索引命中率 | 低 | 高 |