InnoDB引擎的查询过程

在每次查询中。mysql实际上是做了这样两件事情:

首先,在mysql缓存里面查询是不是有与本次查询语句相同的缓存语句(此时是语句本身),如果存在,那么就会直接返回语句所对应的结果(通过key-value的形式存储了语句与其对应的数据),而当我们进行数据的增删改时,这部分的缓存就会被刷新。

其次,当我们没有在查询缓存中命中,就会根据b+树去寻找我们要的数据页,首先在mysql内部的buffer pool里面去进行缓存查找,看看有没有我们所需要的数据页,有的话取出并进行lru算法,没有的话就去数据库进行查询并刷到缓存里来。

叶子节点存储了索引值和对应的数据记录或者对应的数据页的位置。在聚簇索引中,叶子节点直接包含了完整的数据行内容。而在非聚簇索引的设计中,叶子节点存储了指向数据行实际存储位置的指针。

1 LRU算法实现以及优化

我们都知道在InnoDB底层,使用LRU算法,目的是筛选出我们最不需要的数据页,在缓冲池内满了的情况下,将不需要的数据页进行淘汰。

但是如果我们进行了全表扫描的情况下,缓存中就会加入扫描过程中读取到的数据页,按照一般的LRU算法,这些数据页会放在首部,但是问题是我们不希望因此将我们所原本存储的热点数据进行淘汰(因为数据页放在首部会将原有数据后移)。

因此我们在InnoDB引擎里面加了一个Old区,也可以叫做中间区,当我们进行全表扫描、多表查询或者新读取从而得到的数据页时,我们会将这些数据页存到old区(默认old区的占比是3/8),而当我们再次访问这些数据页时,我们才会将数据页放在首部,这样可以有效防止大量扫描以及新读入对于缓存区的污染

2索引结构

常用的索引结构有哈希索引,动态数组索引等等,各种索引所适用的场景尤其区分,而对于InnoDb引擎而言,底层索引使用的是b+树,每个非叶子节点本身就是一个页,存储下一层的目录,本身并不存储数据库的值。只有叶子节点内部会存储,每一页具体包括:存储的最大,最小记录,数据的具体内容,还有多少空间是还没有使用的等。

3总结查询流程

在mysql种。一条查询语句的流程如下

首先判断是否击中查询缓存,是:走查询缓存对应数据;否:走b+树,看数据页的位置;

判断数据页是否在buffer pool中:是:返回数据页数据;否:去数据库磁盘查找数据;

查找完数据:LRU算法。

  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值