范式
第一范式:表中属性不能拆分。
第二范式:表中属性必须完全依赖于主关键字。
第三范式:表中不能包含其他表的非关键信息。
反范式
范式化不一定好,反范式设计就是为了查询性能放弃部分范式和内存占用
范式和反范式的选择
1.缓存和汇总的数据
2.计数器表
表字段类型优化
基本原则:
- 更小的通常更好
- 简单就好
- 尽量避免NULL
整数类型:
unsign无符号比有符号多存储一倍
tinyint | smarllint | mediunint | int | bigint |
---|---|---|---|---|
1字节 | 2字节 | 3字节 | 4字节 | 8字节 |
实数类型
float | double | decimal |
---|---|---|
4字节 | 8字节 | 实际是字符串,效率低 |
字符串类型
char | varchar | blob | text | enum | set |
---|---|---|---|---|---|
定长 | 不定长 |
日期和时间类型
精确到秒
datetime | timestamp |
---|
索引
Hash索引
缺点:不适合范围查找、排序查找、组合索引,容易发生hash冲突
优点:不进行范围和排序,效率高于B+树
B+树
多叉平衡查找树,不是平衡二叉树,因为二叉树太高
与B树的区别:
相同点:都是多叉平衡查找树。
不同点:B树所有节点都存有数据;
B+树只有叶子结点上存数据,非叶子节点只存关键字和指针。
叶子结点数据通过双向链表有序链接。
与B*树的区别:
不同点:B*树中非叶子节点也通过链表相连接。