mysql innerdb 索引,MySQL系列-InnoDB索引优化AHI、Change buffer
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相关推荐
- InnoDB原理篇:Change Buffer是如何提升索引性能的?
前言 相信很多小伙伴设计索引时,考虑更多的是索引是否能覆盖大部分的业务场景,却忽略了索引的性能. 什么?不同的索引,性能还不一样? 是的,这要从change buffer说起. Change Bu ...
- sql server 索引阐述系列五 索引参数与碎片
原文:sql server 索引阐述系列五 索引参数与碎片 -- 创建聚集索引 create table [dbo].[pub_stocktest] add constraint [pk_pub_st ...
- mysql 索引原理_MySQL InnoDB索引原理和算法
也许你经常用MySQL,也会经常用索引,但是对索引的原理和高级功能却并不知道,我们在这里一起学习下. InnoDB存储索引 在数据库中,如果索引太多,应用程序的性能可能会受到影响:如果索引太少,又会对 ...
- mysql 开发进阶篇系列 23 应用层优化与查询缓存
一.概述 前面章节介绍了很多数据库的优化措施,但在实际生产环境中,由于数据库服务器本身的性能局限,就必须要对前台的应用来进行优化,使得前台访问数据库的压力能够减到最小. 1. 使用连接池 对于访问数据 ...
- MySQL(八):InnoDB 日志缓冲区(Log Buffer)
1.简述 当在MySQL中对InnoDB表进行更改时,这些更改首先存储在InnoDB日志缓冲区的内存中,然后写入通常称为重做日志(redo logs)的InnoDB日志文件中. 日志缓冲区是内存存储区 ...
- sql server 索引阐述系列二 索引存储结构
"流光容易把人抛,红了樱桃,绿了芭蕉" 转眼又年中了,感叹生命的有限,知识的无限.在后续讨论索引之前,先来了解下索引和表数据的内部结构,这一节将介绍页的存储,页分配单元类型,区的存 ...
- mysql索引原理传送门_MySQL索引底层实现原理
索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之一. ...
- mysql必须的组件_mysql innodb的重要组件
innodb包涵如下几个组件 一.innodb_buffer_pool: 1 它主要用来缓存数据与索引(准确的讲由于innodb中的表是由聚集索引组织的,所以数据只不是过主键这个索引的叶子结点). 二 ...
- mysql写缓冲_MySQL 数据库的提速器-写缓存(Change Buffer)
写缓存(Change Buffer) 是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在 buffer pool 中的话,在不影响数据一致性的前提下,InnoDB 引擎会将对数据的操 ...
- mysql change buffer
change buffer是存放二级索引的没有在bufferr pool的变更页的缓存区,变更的buffer是由insert,update,delete等操作导致的.等页被加载进buffer pool ...
最新文章
- Excel公式不同引用地址方式的应用总结
- 《黑马程序员》认识OC的第一个程序(Objective-c)
- python笔记-列表和元组
- 用c#开发微信(1)服务号的服务器配置和企业号的回调模式 - url接入
- 20162304 实验三
- C语言函数class,C语言--7-class-while和函数.ppt
- 云原生系列「四」我为啥不看好ServiceMesh?
- 初探IdentityServer4(客户端模式)
- 利用Excel VBA批量计算长时间序列植被物候动态阈值(逐像元)
- 10玩rust_C++工程师的Rust迁移之路(5)- 继承与组合 - 下
- windows守护进程工具_Linux进程管理
- 阿里java注释规范_阿里巴巴Java开发手册-注释规约
- adblock android插件,adblock plus
- Ajax原生XHR和Promise 学习
- 图书信息管理系统(顺序表)
- 在线Markdown table生成工具,Markdown 表格编辑器
- 硕士期间两篇计算机sci二区,实验室两篇论文被SCI 2区期刊Neurocomputing接收
- 物料主数据的维护状态
- MacOS下Go语言环境搭建
- 情态动词+have+done用法整理
热门文章
- ArcGIS10.6基本操作——利用DEM给点赋予高程值
- Spring实战学习笔记整理(4)-AOP(面向切面编程)
- 计算机应用的最广领域,从乡镇企业的从业人员数,我们可以看出:
- 网络爬虫js逆向解决网站登录RSA加密问题,不使用selenium如何实现登录,session维持登录状态请求爬取
- 使用python做手机app后台
- flow_from_directory返回值
- Unity 网格合并MeshBaker(一)
- session的活化和钝化
- Halo博客搭建笔记(以Nginx反向代理 + 负载均衡 + 服务的方式运行Halo博客)
- 2021年茶艺师(中级)考试试卷及茶艺师(中级)模拟试题