|
|
|
@ -0,0 +1,112 @@
|
|
|
|
|
## 1.范式化设计
|
|
|
|
|
|
|
|
|
|
###六种范式:
|
|
|
|
|
|
|
|
|
|
【第一范式】:字段不可再分
|
|
|
|
|
|
|
|
|
|
【第二范式】:要求实体的属性完全依赖于主关键字(主键唯一性)
|
|
|
|
|
|
|
|
|
|
【第三范式】:要求数据不能存在传递关系,即每个属性都和主键有直接关系,而不是间接关系
|
|
|
|
|
|
|
|
|
|
【巴斯-科德范式】:
|
|
|
|
|
|
|
|
|
|
【】
|
|
|
|
|
|
|
|
|
|
###范式一定好吗?
|
|
|
|
|
|
|
|
|
|
范式的好处就是在进行表设计的时候非常的规范。但是会对查询性能有影响,于是就提出了反范式化设计。
|
|
|
|
|
|
|
|
|
|
### 反范式化设计
|
|
|
|
|
|
|
|
|
|
为了性能和读取效率而适当的违反对数据库设计范式的要求。
|
|
|
|
|
|
|
|
|
|
为了查询性能允许存在部分冗余数据。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
## 项目中常见的反范式实现
|
|
|
|
|
|
|
|
|
|
1.缓存与汇总数据
|
|
|
|
|
|
|
|
|
|
2.计数器表设计
|
|
|
|
|
|
|
|
|
|
MySQL处理计数器高并发场景,用槽的设计,为一个实例做多行记录
|
|
|
|
|
|
|
|
|
|
## 字段数据类型优化-整数与实数
|
|
|
|
|
|
|
|
|
|
基本原则:
|
|
|
|
|
|
|
|
|
|
- 更小的通常更好
|
|
|
|
|
- 简单就好
|
|
|
|
|
- 尽力避免null
|
|
|
|
|
|
|
|
|
|
因为更小的字段,一般会有更少的处理时间
|
|
|
|
|
|
|
|
|
|
null对于索引、索引统计会更复杂。可为null 占用更多空间,null列为索引还会额外占用一个字节
|
|
|
|
|
|
|
|
|
|
具体类型:
|
|
|
|
|
|
|
|
|
|
- 整数类型:
|
|
|
|
|
|
|
|
|
|
tinyint[8bit=1byte] 、smalint[16bit=2byte]、mediumint[24bit=3byte]、int[32bit=4byte]、bigint[64bit=8byte]
|
|
|
|
|
|
|
|
|
|
- 实数类型:
|
|
|
|
|
|
|
|
|
|
float、double、decimal[能存最多65个数字,实现是通过字符串存储的]
|
|
|
|
|
|
|
|
|
|
- 字符串类型:
|
|
|
|
|
|
|
|
|
|
char【定长,更省空间,没有记录长度】、varchar【不定长,1-2个额外字节来记录字符串的长度】、blob【用二级制存,不存在字符集排序】、text【字符存,有字符集排序】、enum、set
|
|
|
|
|
|
|
|
|
|
- 日期和时间类型
|
|
|
|
|
|
|
|
|
|
datetime(1001-9999年, 跟时区无关)、timestamp(1970-2038年,跟时区有关系)
|
|
|
|
|
|
|
|
|
|
int的【长度】只影响命令行的显示,Int(1)与Int(11)是在数据存储上都是一样的。
|
|
|
|
|
|
|
|
|
|
字符串列,最大长度比平均长度大很多的情况用varchar,否则用char
|
|
|
|
|
|
|
|
|
|
从存储的角度:
|
|
|
|
|
|
|
|
|
|
‘hello'->char(5) varchar(200) 存储开销是一样的。
|
|
|
|
|
|
|
|
|
|
blob和text这种大字段一般:单独到一张表里面,通过这张表的主键来关联
|
|
|
|
|
|
|
|
|
|
datetime和timestamp都只能存储到秒。
|
|
|
|
|
|
|
|
|
|
### 数据量特别大,实数来存储,确保精读,确保效率,怎么办?
|
|
|
|
|
|
|
|
|
|
业务上来设计:bigint,数据放大100倍,确保两位精读。
|
|
|
|
|
|
|
|
|
|
## 命名规范
|
|
|
|
|
|
|
|
|
|
- 可读性原则
|
|
|
|
|
- 必须使用小写字母加下划线
|
|
|
|
|
- 不使用复数名词
|
|
|
|
|
- 禁用保留字
|
|
|
|
|
- 索引命名
|
|
|
|
|
|
|
|
|
|
1.表的命名不建议使用缩写
|
|
|
|
|
|
|
|
|
|
一般格式:业务名称_表的作用,如biz_order
|
|
|
|
|
|
|
|
|
|
2.索引命名
|
|
|
|
|
|
|
|
|
|
一般格式:主键索引pk\_字段名 唯一索引uk\_字段名 idx\_字段名
|
|
|
|
|
|
|
|
|
|
## 索引是什么?
|
|
|
|
|
|
|
|
|
|
### 哈希索引的弊端
|
|
|
|
|
|
|
|
|
|
范围查找? 只能一个一个精确查找
|
|
|
|
|
|
|
|
|
|
索引排序? 文件排序或者其他排序方式
|
|
|
|
|
|
|
|
|
|
组合索引? 不能实现前缀匹配
|
|
|
|
|
|
|
|
|
|
hash冲突?
|
|
|
|
|
|
|
|
|
|
### B+Tree索引
|
|
|
|
|
|