mysql引擎简述

一、Mysql简介

Mysql是一款开源的数据库软件,搜索引擎是Innodb

二、sql语句是如何在Innodb引擎中执行的

 

 

一条更新语句在mysql数据库中的执行流程是

1、首先将磁盘中的存储的值加载到Buffer Pool缓冲池中

2、将数据的旧值写入undo日志,以便于日后的回滚

3、更新Buffer Pool缓冲池的内存数据

4、将操作语句写入redo日志(防止断电、宕机导致的数据丢失问题)

5、将redo日志加载到磁盘文件中(redo日志是Innodb引擎的日志)

6、准备提交事务binlog日志写入磁盘(mysql的日志)

7、写入binlog文件位置写入conmit标记

三、Buffer Pool缓冲池中的机制

 

Buffer Pool存在三个双向链表分别是free链表、flush链表、LRU链表。free链表存放的是空的描述数据块(描述数据块和缓存页是一一对应关系),描述数据块包括了页数据所在的表空间号和数据页号这样就可以快速的查找到相应的缓存页,当有更新数据的sql语句过来时,free中的描述数据块就会加入到flush链表中,当mysql中的缓存不够用的时候,描述数据快就会加入到LRU链表中,当描述数据块不够用的时候就会将淘汰缓存命中率低的数据块,当数据块有更改数据的操作就会将数据块放到链表的头部,淘汰的时候会进行末位淘汰策略,淘汰时会将相应的缓存页保存进磁盘里(除了空闲的数据块,其他的描述数据块都在在各链表中,每个描述数据快包括三个头结点三个尾节点)。

LRU淘汰算法优化

LRU淘汰算法就是就是将缓存页进行冷热分离,LRU链表将缓存页分为冷数据区和热数据区,冷数据区占全部缓存页的37%,数据页第一次加入缓存,先放在冷数据的头部,当数据加载缓存页1s(默认是1s)之后,才会移动到热数据区的链表头部,热数据区域,只有热数据区域的后3/4部分的缓存页被访问了,才会移动到链表的头部,当淘汰缓存页时会挑选冷数据区域尾部的数据输入磁盘,并将其淘汰。

四、mysql隔离级别

mysql的隔离级别是可重复读,mysql的可重复读就可以解决数据库常见的脏读、幻读、不可重复读的问题

脏读

首先每个事务都有一个事务id,如果有一个事务B的更新请求来到buffer Pool缓冲池查询数据,Buffer Pool缓冲池会先将缓冲池中旧数据写入undo日志中,当旧值保存进undo日志之后,事务B将数据修改并将事务提交过之后,事务A查询就会查询到事务B所提交的数据,此时事务B撤销了对数据的修改,导致事务A读取的数据是无效的,这就是脏读

幻读

幻读就是,当事务A有一条查询ID大于10请求时,本来只有一条满足条件的数据,此时事务B插入了一条满足ID大于10条件的数据,事务A再次查询就会出现多一条的状况,是一种魔幻的行为,就是幻读

不可重复读

不可重复读就是当事务A的查询请求到达Buffer Pool缓冲区的时候,Buffer Pool缓冲区将旧值写入undo日志之中,此时事务B有一条更新数据的请求过来将数据修改成B,这时候事务A再次读取就会读取到数值B,当事务C过来再次进行修改为C之后,事务A再次读取就会读取到数值C,这种多次读取不可以读取到同一个值的行为就叫不可重复读

mysql解决办法

mysql的解决办法就是多版本数据链和read view(当前运行事务只创建一个),多版本数据链就是将每次事务提交过的数据以链表的形式进行连接起来,readview主要包括四个参数,m_ids:当前存在事务的id数组,min_trx_id=当前存在事务的最小id,max_trx_id:下一个要生成的事务id,creator_trx_id=当前的事务id。mysql中利用利用读已提交解决脏读问题的机制是,当事务A进行查询时,事务B进行了回滚,事务A会去read view中查询m_ids中查询是否存在事务B的事务ID如果有就读取旧值,没有就证明事务已经提交,(读已提交每次查询就会生成一个resd view,且事务提交事务id会从m_ids中删除)

mysql中的可重复读级别,解决不可重复读。当事务A还没进行数据提交时,事务B将数据进行修改过之后,事务A再次查询就会去比较min_trx_id如果事务A的事务id大于min_trx_id就会去m_ids查找当时运行的所有事务ID,如果m_ids存在修改数据的事务ID,事务A就会找到比他小的第一个事务ID利用多版本链条读取相应的数据。

mysql索引机制

mysql中的数据页是以双向链表的形式进行连接,每个数据页里边有一个页目录,页目录中包含主键和槽位两个部分,主键部分是将数据页里边的一部分ID进行合并,槽位是这些ID对应的数据,也就是将数据页进行缩小,便于二分法进行查找。(数据页中的每行数据都是按照数据进行排列的,就如ID是逐渐增加的),当有组合索引进行查询时,就如where id=xxx,name=xxx的这种形式,而且id和name都是主键,这时候他们的排列方式就是

mysql索引是基于B+树进行实现的,在mysql的索引中只有叶子节点连接着数据页,当索引页中的空间满了之后就会重新生成一个空白的数据页,将第一个数据页的复制到重新申请的数据页之中,旧的数据页就会变为索引页。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值