数据库索引、脏读等

数据库相关:

1.数据库查询语句(最基本的)
2.数据库的应用: 使用语句直接查询、配合redis使用、使用索引或配合elasticsearch(全文索引)、结合 navicat(分库分表)的使用
数据库中的索引: 主键索引、唯一索引、普通索引、组合索引、全文索引

主键的选择:

有primary key,则该设置的key为主键
没有显示设置,则从非空唯一索引中选择:
只有一个非空唯一索引,为主键
多个非空唯一索引,选择第一个为主键
没有非空唯一索引,自动生成一个6 byte的 _rowid 作为主键

B+树:多路平衡搜索树 搜索树:采用中序遍历的有序结构
平衡二叉搜索树(红黑树,AVL)主要目的:保证搜索时间复杂度的稳定O(logN)
平衡二叉搜索树 和 多路平衡搜索树(B+树) 的区别 : 后者更加矮胖。

MySql为什么使用B+树 ?

​ (1)在对数据进行查找时,每查找一个树中的节点就会进行一次磁盘i/o。树的高度越高,磁盘i/o次数就越高。B+树更加矮胖,进行磁盘i/o次数少
​ (2)对磁盘的访问是以物理页(4K)为单位进行访问的。由于B+树的每一个节点大小时16K(4个物理页大小)进行一次磁盘操作相当于4次磁盘操作。
​ (3)非叶子节点存储的是索引信息、叶子节点存储的是具体数据。叶子节点全部在同一层,且叶子节点间相互链接方便进行范围查询,减少磁盘i/o

每一个索引都对应一个B+树
聚簇索引:叶子节点存储的具体数据就是具体的row(行)数据 由主键构造的B+树
辅助索引:叶子节点存储的具体数据是 索引+主键key
使用辅助索引的查找过程:
根据辅助索引查找到主键,再根据主键使用聚簇索引查找到相应的具体行数据

####根据聚簇索引和辅助索引可以解释:覆盖索引、最左匹配原则、索引失效、SQL优化 等问题

MYSQL链接池的工作原理:

事务用来解决 并发执行 的问题,innodb中采用最小粒度的行级锁(行数据元级别的锁)。
事务可以由一条非常简单的SQL语句组成,也可以是多条复杂的sql语句
在innodb引擎中,每一句sql语句都是事务。

分析事务的ACID特性

原子性(A):
事务操作要么都做,要么都不做。通过undolog实现事务回滚操作,回放事务具体操作的逆运算。
一致性(C):

由原子性、隔离性、持久性来实现的
事务将数据库从一种一致性状态转换到另一种一致性状态。数据库中只存在一种确定的状态,数据库的完整性没有被破坏。
隔离性(I):
每个读写事务的对象 对 其他事务的操作对象不可见。事务提交前对其它事务不可见。主要通过MVCC和锁来实现。
对写操作加锁来实现隔离性,对读操作通过mvcc实现隔离性。
mvcc多版本并发控制,主要解决一致性 非锁定 读,通过获取记录和获取行版本,是实现高效并发读 性能
锁用来处理 并发写操作;数据库中提供粒度锁的策略,针对表(聚簇索引B+树)、页(聚簇索引B+树叶子节点)、行(叶子节点中的一段记录)三种粒度加锁
持久性(D):
事务提交后,写操作将会持久化(将数据写入redolog磁盘文件 哪一个页 页面偏移值 具体数据)。当数据库宕机后可根据redolog物理日志恢复数据。

MVCC多版本控制:

一致性非锁定读,一个事务锁定某一行数据时,其他事务在修改该行时,MVCC会自动生成一个数据快照(可生成多个数据快照)

需要按照一定的规则读取快照数据,READ COMMITTED (读已提交)读取最新的数据快照。

也正是MVCC的这种读取最新的数据快照策略,导致在READ COMMITTED 策略下会产生 不可重复读

不可重复读的解决办法可以使用 REPEATABLE READ 事务来处理不可重复读。这是由于 REPEATABLE READ 读取的是 事务修改之前的数据快照。所以在修改事务提交数据的前、后两次的读取数据是一样的。可重复读但会出现幻读问题,幻读的问题可以通过添加 **读锁(s锁)和写锁(x锁)**即可解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值