3.7 数据库复习

本文详细比较了关系型数据库(如MySQL)和非关系型数据库(如Redis)的优缺点,探讨了SQL语言、索引类型(如哈希索引、B+树索引)、事务的原子性、一致性及隔离级别,并介绍了InnoDB中的锁机制和数据库设计的三范式原则。
摘要由CSDN通过智能技术生成

1  关系型数据库和非关系型数据库的区别

关系型数据库(MySQL等):

是由二维表与其之间的联系组成的一种数组组织,其中最典型的数据结构是

优点:因为其是表与表之间的联系,格式一致,所以易于维护

SQL语言较为通用,可以做一些复杂的查询,使用起来比较方便

缺点:关系型数据库由于以硬盘为载体,所以在读写效率上较差

因为其是表与表之间的联系,格式较为单一,灵活度较差

非关系型数据库(Redis等):

是一种数据结构化存储方法的集合,可以是文档或者键值对等

优点:非关系型数据库可以以硬盘或者存储器为载体,所以读写速度相对来讲较快

非关系型数据库的存储格式可以是多种数据化存储结构所以其存储更加灵活

缺点:没有事务处理,且存储的数据结构可能相对复杂,查询方式较欠缺

非数据库分类及其应用

1 文档型:Web应用等

2 Key-Value型:内容缓存,主要用于处理大量数据的高访问负载,也可用于日志系统等

3 列式数据库:分布式文件系统

4 图形数据库:社交网络,推荐系统等,主要用于构建关系图谱

2 索引

1 是存储引擎用于快速查找数据的一种数据结构

MySQL默认使用的是InnoDB存储引擎

优点:可以快速查找,减少服务器需要扫描的数据量

可以将随机IO变为顺序IO,提高查询的性能

2 常见的索引类型:

哈希索引:查找快,但不支持范围查找和排序

全文索引:用于全文搜索的索引类型,可以执行关键字搜索,但在数据量大的情况下搜索速度可能变慢,其维护成本较大

B+树索引:目前关系型数据库常用的最有效的索引,其能够加快访问数据的速度,不需要全表扫描来获取需要的数据,B+树索引是顺序组织存储,所以较为适合查找范围数据

3 B+树

B+树索引分为聚簇索引(主键索引)和非聚簇索引(二级索引)

B树:不限制一个节点只能有两个子节点,通过降低树的高度来减少磁盘的IO次数,每次读取可以加载出多个节点,适用于需要高效访问磁盘的场景

B+树:是B树的升级,B+树只有叶子节点存储数据,非叶子节点只存索引。叶子节点包含了所有索引,同时叶子节点构成一个有序链表,范围查找更快,由于非叶子节点只存索引,所以B+树相对B树可以存储更多索引,高度更低,磁盘IO次数更少

4 前缀索引

如存储的TEXT文本类型数据由于文本数量可能较大MySQL不允许索引完整长度,所以可以以开头的部分字符作为索引提高索引效率。缺点是前缀索引可能会降低索引选择性(不重复的索引值与总行数的比值),所以要选择足够长的前缀保证较高的选择性同时又不能太长

5 聚簇索引

是B+树的一种索引,一种数据存储方式,它是将数据放在索引的叶子页,索引和数据在同一个B+树上,由于无法同时把数据放在两个地方,所以一个表只有一个聚簇索引

优点:索引和数据保存在一起,所以数据访问会更快

缺点:插入速度较为依赖插入的顺序且更新聚簇索引列的代价较高

6 索引覆盖(覆盖索引)

如果查询需要的数据可以直接从索引中获取,不用查询表中实际数据,那么这个索引就是一个覆盖索引,其可以减少树的搜索次数,避免了回表,提升查询性能

7 最左前缀原则

在创建多个索引时,会同时创建其从左依次开始的前缀索引,这样在查找时可以更快的过滤行

8 索引策略

1 独立的列:查询时索引列不能作为表达式的一部分,也不能是函数的参数,这两种情况会导致索引失效

2 使用前缀索引:可以节约索引空间提高索引效率,但需要平衡索引的选择性

3 使用联合索引:可以避免回表,减少大量IO操作

4 索引列顺序:合适选择索引列顺序,通常可以将选择性高的列放在前面

5 合适的主键:最好选择不会修改的列作为主键,不考虑分库分表的情况最好使用自增主键

6 不建立重复或不适用的索引

9 三范式

是关系型数据库设计的一种规范,目的是建立结构合理的数据库,提高数据存储和使用的性能

第一范式:

保证列的原子性

第二范式:

确保唯一性和依赖性,每个表都有主键,且其他字段完全依赖主键

在第一范式的基础上要求表中每一条数据都可以被唯一区分,通常使用主键实现

第三范式:

在第二范式的基础上,非主键字段必须依赖于主键,不能存在传递依赖

优点:重复数据很少或者没有,表更小,执行操作更快,更新操作快

缺点:复杂查询需要关联,可能会造成索引失效

10 事务

原子性的工作查询,一个独立的工作单元,如果成功则全都成功,如果失败则全都执行失败

事务的四大特性:

1 原子性:事务是最小工作单元,不可拆分,要么全成功要么全失败,不能执行其中部分操作

2 一致性:数据库总是会从一个一致的状态转换成另一种一致的形态,不会出现某条语句失败导致出现其他形态

3 隔离性:一个事务在最终提交前其他事务不可见

4 持久性:事务一旦提交便永久保存到数据库中,即使崩溃修改后的数据也不会丢失

并行事务带来的问题:

数据一致性:

脏读:事务可能会读到其他事务未提交的数据

不可重复读:前后读取的数据不一致

幻读:前后读取的数据量不同

隔离级别:

未提交读:不能防止以上三种数据一致性问题

提交读:可以防止脏读

可重复读:可以防止脏读和不可重复读(MySQL默认隔离级别)

可串行化:可以防止以上三种数据一致性问题

实现隔离级别的方法:

1 加锁:读数据前对其加锁,阻止其他事务对数据的修改

2 快照:

11 InnoDB中的锁

1 共享锁:读锁,允许事务读取数据

2 排他锁:写锁,允许事务删除或更新数据

3 意向锁:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值