MySQL索引和事务

MySQL索引

牛客课程,整理笔记

参考书目

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

聚集索引存放完整的数据,辅助索引并不是完整的数据
哈希索引内部为了提高性能选使用或不使用的机制,我们只要了解即可,不能干预
全文索引做的事情类似于搜索引擎,不是去数据库扫描,而是先把关键词存放的位置做一个映射,一旦搜索某个词,直接通过索引找到具体的位置,然后去这个位置去查。全文索引用的比较少

所以主要还是看B+树索引
在这里插入图片描述

InnoDB存储引擎中,表的数据是依赖索引组织存放的
在这里插入图片描述

约束是一个需求,而索引是一个具体的实现方案
在这里插入图片描述

在这里插入图片描述

InnoDB存储引擎管理磁盘空间最小单位是页,页中容纳若干行,但是不是针对行来管理的。
如果要查某一个行的数据,会先定位到页,然后放到缓冲中,然后从中找到某一个行

补:
在这里插入图片描述

在这里插入图片描述

数据段和索引段是有关系的,回滚段是存放日志的

undo页是回滚页

在这里插入图片描述

在这里插入图片描述

聚集索引每一个叶子节点存放的一行的数据都是完整的,而辅助索引存放的是一行的若干列

在这里插入图片描述

这里为什么要设置为7000呢,因为要人为控制每页只能存放两条记录

在这里插入图片描述

上面一层是索引,下面是数据
Page偏移量,表示四页连续的空间,第3页存索引,456页存数据
Key是将主键换算成16进制形式的表示
索引数据是在哪一列建立的索引,然后将索引分成区间,每个区间存储索引字段和具体指向的数据页的指针
叶子节点存储的是完整的数据行

什么叫索引组织表,是这个表里的数据不是单独孤立的存在某一个空间内,一定是挂载在索引的末集,必须依附索引来存储
把聚集索引的所有叶子节点单独拿出来,就是所有的数据行了,只不是不在一页中,在若干页中通过指针相连,是有序的结构,通过索引来排序

在这里插入图片描述

辅助索引中间节点存储了索引字段,叶子节点除了包含索引值,还有书签

在这里插入图片描述

在刚刚那个表基础上,加一列数据c,并添加辅助索引
在这里插入图片描述

在这里插入图片描述

这个表promotion中,item_id不是主键索引

在这里插入图片描述

在这里插入图片描述

覆盖索引只是一个场景下的情况,而不是一个单独类别的索引。覆盖索引是完全通过辅助索引就能够得到要查找的数据,不用通过聚集索引
所以一般不让写select *

在这里插入图片描述

举例,建立了一个联合索引,首先保证a的顺序,然后再保证第二列的数据,以此类推
所以这就提示了,查找的时候该如何利用这个索引
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

第一个查a ,能用上索引;第二条查b,就不能用到索引了,因为单独看b,不是有序的

最后一条,查到了a的范围,但是在这个范围内,b就不一定是有序的,所以这条语句可能会走这个索引,不会只会利用a这一列的有序性,b不会用上,硬查

例如,查找a = ‘ ’ and c = ‘ ’,能用上这个索引,但还是只能用a,c用不上

在这里插入图片描述

如果存储引擎监控到老是查询一些数据,会建立哈希索引,将页存储在缓冲区中。哈希索引指向频繁访问的数据
在这里插入图片描述

在这里插入图片描述

这里多个文档所在位置是指单词所在的列,但是这一列中可能有多个不同的单词,所以第二种表现形式存储了单词所在位置,更精细
全文索引一般建立在大的字段上
在这里插入图片描述
在这里插入图片描述

第一种方式,存储的是行号

在这里插入图片描述

第二中方式,还存了具体的位置,更加精细
在这里插入图片描述
在这里插入图片描述

了解一下,具体查文档吧

MySQL事务

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

隔离性是由锁来实现的,其他性质是由日志来实现的

在这里插入图片描述

InnoDB引擎既支持行级锁,也支持表级锁
在这里插入图片描述

意向锁,希望在行上加行级锁之前,先在表上加上意向锁,相当于声明一下;这样就会将竞争或者说锁的互斥提前了,提到一个更高的维度、粒度上去,在更高的维度上发现没有意向锁,那么没有冲突,就能加上行级锁
因为找到表是很快的,但是如果要定位到某一行再判断是否有锁,速度比较慢;这样可以提高性能

在这里插入图片描述

只要出现了X锁都是不兼容的。
表级锁之间是兼容的

在这里插入图片描述

行锁是基于某一页的设计,n_bits是锁的位图,意思是在这一页中,第一行是0还是1,第二行是0还是1…0代表无锁,1代表有锁,用一个二进制位代表这样的信息,这样就能很快知道每一行是否有锁而且节约内存
行锁的标识是在页上的

锁是被事务所持有的,有可能一个事务涉及到多张表,所以这里有一个链表指向下一个锁

位图的存储形式如下:
20区,100页,用一个314位存储每一行的锁的情况
在这里插入图片描述

在这里插入图片描述

这里读的快照,不同的隔离级别选择的快照不一样

在这里插入图片描述

read committed 级别2
repeatable read 级别3

在这里插入图片描述

如果写了这两句话,就不会读取历史版本的数据。另外,如果有一个想这样排他的读数据,而另一个人也希望这样读,那么就得等待,因为要读的是最新的数据
这两个规则可以打破MVCC的规则
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果不加锁,或者锁不到位,可能出现的五种问题:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四个级别,从上到下1 2 3 4,读取未提交,读取已提交,可重复读,序列化,无论是哪种级别,丢失更新不存在
3 4 都能解决所有问题,但是3还可以支持MVCC

在这里插入图片描述

在这里插入图片描述

重做日志文件是在硬盘中的,
为了保证每日日志都能写入重做日志文件,都需要在将缓存写入重做日志文件后,调用fsync操作,强制写入磁盘中
顺序写入磁盘性能还是比较好的
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

分布式事务一定是来两阶段提交的,需要有一个协调者,使大家一起成功或者失败
外部分布式事务是数据库与数据库之间的,内部分布式事务是数据库引擎与数据库之间的
在这里插入图片描述

redolog、undolog是InnoDB的log
binlog是mysql的log
主从复制的核心是通过binlog去同步数据的
在这里插入图片描述

在这里插入图片描述

如果先写了二进制日志,并传给了从服务器,而在写入redolog时,发生了错误,那么就应该回滚到开始的位置,binlog应该去掉,但是此时从服务器已经生成了relaylog中继日志,主从已经不一致的
在这里插入图片描述

解决方法就是在写入二进制日志前,先加一个标识xid;这时,如果在写入redolog时发生了宕机,那么会检查这个xid事务刚刚是否已经提交,如果没有的话,会根据binlog写一份redolog提交

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值