关系型数据库
- 第一范式:满足所有字段不可再分
- 第二范式:在第一范式的前提下,每个非主属性都完全函数依赖于主键,就是根据主键可以推出所有非主属性
- 第三范式:在第二范式的基础上,如果每个非主属性都不传递函数依赖于主键,就是非主属性中不存在传递依赖
- BC范式:满足BC范式的关系将消除任何属性(主属性和非主属性)对关系键的部分函数依赖和传递函数依赖(在第三范式的基础上,主属性中也不能存在传递依赖和部分依赖)
数据库索引与B+树
- 新建表格,有列abcde,其中a为主键
- 主键索引如下图
- 新建索引(bcd),索引图如下:
- 所以新建索引的时候,不会完全复制整张表的数据,仅在新建的B+树的数据页中存储索引列和主键列,增加主键列是因为方便回表查询,比如按照索引查询,要返回所有列,那么先查询索引树得到主键,然后再去主键树中查询即可得到所有列
mysql中explain字段
explain:用于执行sql语句,并返回其执行过程
explain:id
- id相同,由上到下执行
- id不同,则大id优先执行
explain:select_type
- simple:普通select查询,不含子查询、联合查询(union)
- primary:主查询,包含子查询,最外层标记为主查询
- subquery:子查询
- derived:衍生查询,子查询中的结果存放在临时表中,则被标记为derived
- union:联合查询,用于标记union关键字后的select查询
- union result:select的查询结果作为一张临时表出现在from关键字后
explain:table:操作的数据库表名
explain:partitions:操作的数据库表所在分区名
explain:type解释
- system:表中仅有一条记录
- const:通过一次索引就查到,相当于where条件查询中条件为常量,且表中仅一行数据匹配
- eq_ref:通过索引扫描,表中仅一行数据匹配
- ref:通过索引扫描,多行匹配
- range:只检索给定范围的行,使用一个索引来选择行
- index:全索引树扫描,遍历整颗索引树
- all:最差的,全表扫描
explain:possible_keys:查询中可能使用的索引
explain:key:查询中实际使用的索引
explain:ken_len:索引字段的最大可能长度
explain:ref:显示索引哪一列被使用了,如果可能的话,是一个常数。指明哪些列或常量被用于查找索引列上的值。
explain:rows:大致估算出找到所需的记录需要读取的行数
explain:rows:server层过滤后,剩下的满足查询记录的数量占比
explain:Extra解释:
- using filesort:使用了索引来进行查询,但是排序时没有使用索引(索引的作用是查询和排序,速度很快),不要出现
- using temporary:查询的时候使用索引,但是group和order的时候,不是按照索引来,那么会创建临时表(尽量在要排序和group的地方创建索引),绝对不要出现
- using index:使用了索引