MySQL系列-InnoDB索引优化AHI、Change buffer

运维少年 运维少年

系列文章说明

MySQL系列文章包含了软件安装、具体使用、备份恢复等内容,主要用于记录个人的学习笔记,主要使用的MySQL版本为5.7.28,服务器系统版本为CentOS 7.5。本章节内容为InnoDB索引优化AHI、Change buffer介绍。

索引优化算法-AHI

AHI(Adaptive Hash index - 自适应哈希索引)是MySQL索引的自优化算法之一,其主要的作用是将热索引的内存地址生成hash表,保存在内存中,当SQL语句调用到该索引时,可以直接找到该页(不需要从根节点-->枝节点-->叶节点)。

AHI 在实现上就是一个哈希表:从某个检索条件到某个数据页的哈希表,仿佛并不复杂,但其中的关窍在于哈希表不能太大(哈希表维护本身就有成本,哈希表太大则成本会高于收益),又不能太小(太小则缓存命中率太低)。

①AHI 是为某个索引树建立的(当该索引树层数过多时,AHI 才能发挥效用)。

②如果某索引只被使用一两次,就为之建立 AHI,会导致 AHI 太多,维护成本高于收益。

条件一:热索引

AHI不会为所有的索引生成hash表,如果所有的索引都生成hash表,维护的成本过高。当索引被查询的次数超过一定阈值时,才有可能建立hash值。

条件二:热索引的热条件

AHI也不会为一个索引的所有数据建立hash值,当被查询的条件数据出现次数达到一定阈值时,才会建立hash值。

AHI查找过程:

索引优化-change buffer

一般来说,我们更新、删除、添加一条记录的时候,首先会去buffer pool 寻找这条数据,假如该数据存在,那么直接更新在内存中的纪录(合适的时候会回刷)。但是要是buffer pool 不存在呢 ?MySQL 为了避免每次遇到这样的情况都会去磁盘上加载数据,于是就设计了 change buffer , 通俗地说就是先将对记录的更改操作暂时纪录在 change buffer ,待合适的时候再进行回刷回磁盘,提高更新操作的性能。

Change buffer的主要目的是将对二级索引(辅助索引)的数据操作缓存下来,以此减少二级索引的随机IO,并达到操作合并的效果。所以以上说的记录,指的是二级索引(辅助索引)。

change buffer 位于 buffer pool中,默认最多能使用1/4的buffer pool空间,实际上,change buffer是系统表空间的一部分,当数据库服务器关闭时,索引更改将存储在其中。

当有位于change buffer 中的数据被加载到buffer pool中时,change buffer会做一个merge(合并)操作。

当buffer pool中有需要修改、删除的辅助索引值时,会直接在内存中修改,后续会批量写入磁盘。

默认情况下,可以通过以下命令查看那些操作插入change

buffer:

select @@innodb_change_buffering;

all

默认值:缓冲区插入,删除标记操作和清除。

none

不要缓冲任何操作。

inserts

缓冲区插入操作。

deletes

缓冲区删除标记操作。

changes

缓冲插入和删除标记操作。

purges

缓冲在后台发生的物理删除操作。

通过以下命令可以查看change buffer 能使用到buffer pool的大小,默认是25,即1/4

select @@innodb_change_buffer_max_size;

THE END

mysql innerdb 索引,MySQL系列-InnoDB索引优化AHI、Change buffer相关推荐

  1. InnoDB原理篇:Change Buffer是如何提升索引性能的?

    前言 相信很多小伙伴设计索引时,考虑更多的是索引是否能覆盖大部分的业务场景,却忽略了索引的性能. 什么?不同的索引,性能还不一样? 是的,这要从change buffer说起.   Change Bu ...

  2. sql server 索引阐述系列五 索引参数与碎片

    原文:sql server 索引阐述系列五 索引参数与碎片 -- 创建聚集索引 create table [dbo].[pub_stocktest] add constraint [pk_pub_st ...

  3. mysql 索引原理_MySQL InnoDB索引原理和算法

    也许你经常用MySQL,也会经常用索引,但是对索引的原理和高级功能却并不知道,我们在这里一起学习下. InnoDB存储索引 在数据库中,如果索引太多,应用程序的性能可能会受到影响:如果索引太少,又会对 ...

  4. mysql 开发进阶篇系列 23 应用层优化与查询缓存

    一.概述 前面章节介绍了很多数据库的优化措施,但在实际生产环境中,由于数据库服务器本身的性能局限,就必须要对前台的应用来进行优化,使得前台访问数据库的压力能够减到最小. 1. 使用连接池 对于访问数据 ...

  5. MySQL(八):InnoDB 日志缓冲区(Log Buffer)

    1.简述 当在MySQL中对InnoDB表进行更改时,这些更改首先存储在InnoDB日志缓冲区的内存中,然后写入通常称为重做日志(redo logs)的InnoDB日志文件中. 日志缓冲区是内存存储区 ...

  6. sql server 索引阐述系列二 索引存储结构

    "流光容易把人抛,红了樱桃,绿了芭蕉" 转眼又年中了,感叹生命的有限,知识的无限.在后续讨论索引之前,先来了解下索引和表数据的内部结构,这一节将介绍页的存储,页分配单元类型,区的存 ...

  7. mysql索引原理传送门_MySQL索引底层实现原理

    索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之一. ...

  8. mysql必须的组件_mysql innodb的重要组件

    innodb包涵如下几个组件 一.innodb_buffer_pool: 1 它主要用来缓存数据与索引(准确的讲由于innodb中的表是由聚集索引组织的,所以数据只不是过主键这个索引的叶子结点). 二 ...

  9. mysql写缓冲_MySQL 数据库的提速器-写缓存(Change Buffer)

    写缓存(Change Buffer) 是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在 buffer pool 中的话,在不影响数据一致性的前提下,InnoDB 引擎会将对数据的操 ...

  10. mysql change buffer

    change buffer是存放二级索引的没有在bufferr pool的变更页的缓存区,变更的buffer是由insert,update,delete等操作导致的.等页被加载进buffer pool ...

最新文章

  1. Excel公式不同引用地址方式的应用总结
  2. 《黑马程序员》认识OC的第一个程序(Objective-c)
  3. python笔记-列表和元组
  4. 用c#开发微信(1)服务号的服务器配置和企业号的回调模式 - url接入
  5. 20162304 实验三
  6. C语言函数class,C语言--7-class-while和函数.ppt
  7. 云原生系列「四」我为啥不看好ServiceMesh?
  8. 初探IdentityServer4(客户端模式)
  9. 利用Excel VBA批量计算长时间序列植被物候动态阈值(逐像元)
  10. 10玩rust_C++工程师的Rust迁移之路(5)- 继承与组合 - 下
  11. windows守护进程工具_Linux进程管理
  12. 阿里java注释规范_阿里巴巴Java开发手册-注释规约
  13. adblock android插件,adblock plus
  14. Ajax原生XHR和Promise 学习
  15. 图书信息管理系统(顺序表)
  16. 在线Markdown table生成工具,Markdown 表格编辑器
  17. 硕士期间两篇计算机sci二区,实验室两篇论文被SCI 2区期刊Neurocomputing接收
  18. 物料主数据的维护状态
  19. MacOS下Go语言环境搭建
  20. 情态动词+have+done用法整理

热门文章

  1. ArcGIS10.6基本操作——利用DEM给点赋予高程值
  2. Spring实战学习笔记整理(4)-AOP(面向切面编程)
  3. 计算机应用的最广领域,从乡镇企业的从业人员数,我们可以看出:
  4. 网络爬虫js逆向解决网站登录RSA加密问题,不使用selenium如何实现登录,session维持登录状态请求爬取
  5. 使用python做手机app后台
  6. flow_from_directory返回值
  7. Unity 网格合并MeshBaker(一)
  8. session的活化和钝化
  9. Halo博客搭建笔记(以Nginx反向代理 + 负载均衡 + 服务的方式运行Halo博客)
  10. 2021年茶艺师(中级)考试试卷及茶艺师(中级)模拟试题