数据库基础

本文深入探讨了MySQL数据库的索引类型,特别是聚焦于覆盖索引和事务的隔离性。讲解了不同类型的索引,如聚集索引和非聚集索引,以及它们在查询效率上的差异。同时,提到了事务的ACID属性和隔离级别,强调了在大量数据操作时使用事务的重要性。此外,还分析了不同数据库范式对数据结构的影响,以及如何通过优化索引来提升查询性能。最后,讨论了索引在不同场景下的应用和优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好讲解:索引讲解
好讲解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 TANSACTIONbegin
提交事务: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+树,树中存放的是主键的索引值,根据主键和物理地址二次查找(即回表查询)去
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值