数据库相关

数据库相关

基础知识

三范式

  • 第一范式 属性的原子性: 所谓的第一范式就是数据库中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性,如果出现重复的属性则需要重新构建实体,新的实体由重复的属性构成。
    例如:一个用户表里面存在属性address表示用户的地址,而这个address可以拆分为 province、city、distinct这个三个属性,那么这个address属性就不是原子性的。
  • 第二范式 非主属性完全依赖于主键:第二范式基于第一范式的基础上,增加属性完全依赖于主关键字。即不存在依赖于部分主属性。
    例如在学生选课表中存在字段:学号、课程号、成绩、学分,主键是(学号、课程号),但是学分却部分依赖于主属性课程号,所以这个表不满足第二范式,导致数据冗余。
  • 第三范式 2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖) 例如:在职工信息表里面,存在部门编号字段,那么便不能将部门的名称或者其他属性加入,加入了就会造成部门名称依赖于部门编号,违反了三范式。

MySQL索引

MySQL索引结构B+树

  • B+树是平衡的多路搜索树,B+树上非叶子节点只存储关键字,叶子节点存储关键字以及关键字信息,并且叶子节点有一个指向右边叶子节点的指针。

  • 特征:

    1.根节点至少有两个孩子节点
    2.非根节点至少有M/2个孩子节点,之多M个
    3.每一个叶子节点都包含K-1个元素(M/2 <= K <= M)
    4.所有叶子节点都位于同一层
    

MySQL索引类型

1.普通索引
2.唯一索引(列值必须唯一)
3.多列索引(使用时注意最左前缀表达式)
4.主键索引(一个表只能有一个)
5.全文索引(InnoDB不支持)

什么时候创建索引

1.经常用作查询条件的字段
2.经常用作连接表的字段
3.经常出现在order by、group by之后的字段

创建/使用索引需要有哪些注意

1.选择非空字段作为索引(MySQL很难对空置做查询优化)
2.选择区分度高,离散度大字段作为索引
3.索引的长度不要太长
4.数据少的表不需要建立索引
5.经常进行插入、删除、修改的不建立索引
6.永远小表驱动大表

-- 工作原理,先查B表数据,然后查A的 id 
select * from A where id in (select id from B)
-- 工作原理,先查A表的id,然后查B表的id
select * from A a where exists (select 1 from B b where a.id = b.id )

-- 结论:当B表的数据小于A表时候用 in;当A表数据小时候用 exists

索引失效场景

1.以%开头的模糊查询
2.OR进行查询时,两边必须都是索引字段才走索引
3.没有满足最左前缀原则
4.字段类型不匹配(例如 id = ‘8’,而id是整数类型)
5.对索引字段进行的函数运算
6.!=,<>,NOT IN,IS NOT NULL,NOT EXISTS等不会走索引

你可能感兴趣的:(MySQL)