好讲解:索引讲解
好讲解2: MySQL 的覆盖索引与回表 - 张德检的文章
0 数据库
关系型数据库:mysql, oracle, access等等
0.1 语句
DDL:DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括create、drop、alter等。
DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用的语句关键字主要包括 insert、delete、update和select等。
DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。
0.2 事务
好的解说:B站事务解说
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位。
事务ACID:原子性、一致性、隔离性、持久性
- 原子性:事务包含的所有操作要么全部成功,要么全部失败回滚。
- 一致性:一个事务执行之前和执行之后都必须处于一致性状态。比如a和b账户共有1k元,两人转账后无论成功or失败,它们的账户资金综合依旧是1k
- 隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。和隔离级别相关。如read commited,一个事务只能读到已经提交后的修改
- 持久性:一个事务一旦提交,对数据库中的数据的修改就是永久的,即时在数据库遇到故障的情况下也不会丢失提交事务的操作。
隔离级别
幻读:两次读取的数据记录数是不一样的。(也可以表现为,b会话事务插入了数据以后,a数据就不能插入针对id的数据)
事务回滚只用于DML,不适用于DDL。
在执行较大量的update或delete时,提醒自己一定要用事务。
开启事务:START TANSACTION
、begin
提交事务:COMMIT
回滚事务:rollback
;
隔离性的MVCC
MVCC为多版本并发控制,即同一条记录在系统中存在多个版本(可理解为快照)。保证数据一致性的前提下提供一种高并发的访问性能。对数据读写在不加读写锁的情况下实现互不干扰,解决读写锁冲突,从而实现数据库的隔离性,在事务隔离级别为读提交和可重复读中使用到(因为读未提交读取到的是最新数据,而串行化对每一行都加了读写锁)。
0.3 数据库三大范式
第一范式1NF
确保数据库表字段的原子性。
强调的是列的原子性,即每一列都是不可再分的最小数据单元。
比如字段 userInfo: 山东省 1318162008
,依照第一范式必须拆分成 userInfo: 山东省
userTel:1318162008
两个字段。
第二范式2NF
要求:
1、满足1NF;
2、表必须有一个主键;
3、对于没有包含在主键中的列(非主键的其他列)必须完全依赖于主键,而不能只依赖于主键的一部分(比如某一个主键)。
例子:
假定选课关系表为StudentCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),主键为(学号, 课程名称)。
其中学分完全依赖于课程名称,姓名年龄完全依赖学号,不符合第二范式,会导致数据冗余(学生选n门课,姓名年龄有n条记录)、插入异常(插入一门新课,因为没有学号,无法保存新课记录)等问题。
01 mika 18 高数 100
01 mika 18 语文 100
? ? ? 英语 ?
可以拆分成三个表:学生:Student(学号, 姓名, 年龄);课程:Course(课程名称, 学分);选课关系:StudentCourseRelation(学号, 课程名称, 成绩)。
第三范式3NF
要求:
1、满足2NF;
2、非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
例子
假定学生关系表为Student(学号, 姓名, 年龄, 学院id, 学院地点, 学院电话),主键为"学号"。
其中学院id依赖于学号,而学院地点和学院电话依赖于学院id,存在传递依赖,不符合第三范式。
可以把学生关系表分为如下两个表:学生:(学号, 姓名, 年龄, 学院id);学院:(学院,id 地点, 电话)。
2NF和3NF的区别?
2NF依据是非主键列是否完全依赖于主键,还是依赖于主键的一部分。
3NF依据是非主键列是直接依赖于主键,还是直接依赖于非主键。
索引
1.1 概念
定义1:索引是 帮助MYSQL 高效获取数据的排好序的数据结构。
定义2:索引在mysql中是一种键,是存储引擎用来快速找到记录的一种数据结构。
定义3:数据库只做两件事情:存储数据、检索数据。而索引是在你存储的数据之外,额外保存一些路标(一般是B+树),以减少检索数据的时间。所以索引是主数据衍生的附加结构。
目的:索引的目的在于提高查询效率。
一张表可以建立任意多个索引,每个索引可以是任意多个字段的组合。索引可能会提高查询速度(如果查询时使用了索引),但一定会减慢写入速度,因为每次写入时都需要更新索引,所以索引只应该加在经常需要搜索的列上,不要加在写多读少的列上。
1.2 索引优缺点
优点
- 大大加快检索速度
- 加快表与表之间的连接
- 使用分组group 和排序order字句的时候,可以显著减少查询中分组和排序的时间
排序查询的sql需求:树形的有序特性,能保持O(log(n))的高效率。
- 分组:group by
- 排序:order by
- 比较<, >
缺点
- 占用物理空间
- 创建和维护索引需要花费时间
1.3 索引类型
按照物理地址和逻辑地址是否一致可以分为:聚集索引、非聚集索引(辅助索引、二次索引、普通索引)
- 聚簇索引:数据存放的物理顺序与逻辑顺序一致。按照主键索引构造B+树(没有就唯一索引、还没有就rowid),树中的叶子节点存放的是所有列的数据,也就是数据所在的物理地址。
- 非聚簇索引:数据存放的物理顺序与逻辑顺序不一致。按照辅助索引构建B+树,树中存放的是主键的索引值,根据主键和物理地址二次查找(即回表查询)去