1. 数据库范式
- 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
如电话列可进行拆分—家庭电话、公司电话- 第二范式(2NF):首先是符合第一范式,另外包含两部分内容,一是表必须有主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分
- 第三范式(3NF):首先是符合第二范式,另外非主键列必须直接依赖于主键,不能存在传递依赖。
比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
这样一个表结构,就存在上述关系。 学号–> 所在院校 --> (院校地址,院校电话)
这样的表结构,我们应该拆开来,如下。
(学号,姓名,年龄,性别,所在院校)–(所在院校,院校地址,院校电话)- BC范式,
所有非主属性对每一个码都是完全函数依赖;
所有主属性对每一个不包含它的码也是完全函数依赖;
没有任何属性完全函数依赖于非码的任何一组属性。
例如:有关系模式C(Cno, Cname, Pcno),Cno, Cname, Pcno依次表示课程号、课程名、选修课。可知关系C只有一个码Cno,且没有任何属性对Cno部分函数依赖或传递函数依赖,所以关系C属于第三范式,同时Cno是C中的唯一决定因素,所以C也属于BC范式
满足这些规范的数据库是简洁的、结构明晰的;同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常
2.数据库索引
什么是数据库索引
索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据。常见的MySQL主要有两种结构:Hash索引和B+ Tree索引,我们使用的是InnoDB引擎,默认的是B+树
- 优点:
索引可以大大提高MySQL的检索速度
创建索引可以大大提高系统的性能- 缺点:
创建索引和维护索引要耗费时间
索引需要占物理空间
索引需要动态维护,降低了数据的维护速度
为什么索引要使用B+树,和hash索引比有什么优缺点
1.Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,对于区间查询是无法直接通过索引查询的,就需要全表扫描。所以,哈希索引只适用于等值查询的场景。而B+ 树是一种多路平衡查询树,所以他的节点是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描
2.如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题
3.哈希索引没办法利用索引完成排序
聚簇索引和覆盖索引
1.聚簇索引:
InnoDB的B+ Tree可能存储的是整行数据,也有可能是主键的值。
在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引
- 聚簇索引的查询会更快:因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询
2.覆盖索引:
指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。
当一条查询语句符合覆盖索引条件时,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。
联合索引、最左前缀匹配
对于查询概率比较高,经常作为where条件的字段设置索引
两个或更多个列上的索引被称作复合索引
在创