innodb引擎的三大特性,插入缓冲(change buffer),两次写(doule write),自适应哈希索引(AHI)
说说innodb三大特性:
插入缓冲(change buffer),两次写(double write),自适应哈希索引(adaptive hash index)
构成了innodb的三大特性,这些性能让innodb引擎有了更好的性能和可靠性。
(1)插入缓存
影响数据库的主要性能问题是I/O,而插入缓存的作用就是把普通缩影上的DML操作从随机I/O变成顺序I/O,工作原理:先判断插入的普通索引页是否在缓冲池中,如果在就可以直接插入,不过不在就先房子change buffer 中,然后进行changebuffer普通索引的合并操作,可以将多个插入合并到一个插入中,提高了普通索引的插入性能。
show global variables like ‘innodb_change%%’;
±------------------------------±------+
| Variable_name | Value |
±------------------------------±------+
| innodb_change_buffer_max_size | 25 |#生产配置25
| innodb_change_buffering | all |
±------------------------------±------+
2 rows in set (0.00 sec)
innodb_change_buffer_max_size的含义:占innodb_buffer_pool的最大比例,默认25%,最大占bufferpool1/4.
innodb_change_buffering change_buffer的类型:
有如下几种类型:
all:缓冲全部inserts,delete标记操作的purge操作。
none:关闭insert buffer .
insert:insert 标记操作。
delete:delete标记操作。
changes:为进行实际insert 和delete,试试标记,等待后续purge.
建议选择默认的all就可以了(生产配置)。
需要满足的条件:
索引是辅助索引
索引不是唯一索引。
(2)两次写(double write)
插入缓冲带来的是针对普通索引插入性能上的提升,而double write就是保证写入的安全性,防止mysql实例发生宕机时,数据丢失,其实两次写就是多了一个redo 页的副本,如果实例宕机了,可以先通过副本把原来的页还原出来,再通过redo log进行恢复,重做,这就是double write的作用,
doublewrite由两部分组成:
一部分时内存中的doublewrite buffer,大小占2MB,
一半部分是物理磁盘共享表空间中连续的128个页,即2个区,大小同样为2MB。
在对缓冲池的赃页进行刷新时并不直接写磁盘,而是会通过memcpy函数将赃页先复制到内存中的doublewrite buffer,之后通过doublewrite buffer再分两次,每次1MB地写入共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘,避免缓冲写带来的问题,在这个过程中,因为doublewrite页是连续的,因此这个过程是顺序写的,开销并不是很大,在完成doublewrite页的写入后,在将doublewrite buffer中的页写入各个表空间文件中,此时的写入则是离散的,可以通过下列命令观察到doublewrite运行情况。
show global status like ‘innodb_dblwr%’;
±---------------------------±------+
| Variable_name | Value |
±---------------------------±------+
| Innodb_dblwr_pages_written | 6325180|#共写了多少页
| Innodb_dblwr_writes | 100400|#共写入的次数想·
±---------------------------±------+
2 rows in set (0.00 sec)
查看是否开启double write功能。
show global variables like ‘innodb_doublewrite%’;
±-------------------±------+
| Variable_name | Value |
±-------------------±------+
| innodb_doublewrite | ON |
±-------------------±------+
1 row in set (0.00 sec)
(3)自适应哈希索引
哈希是一种非常快的查找方法,innodb存储引擎会监控对表上各索引页的查询,如果观察到简历啊哈希索引可以带来速度提升,则建立哈希索引,简称自适应哈希索引AHI。
innodb存储引擎会自动根据访问的频率和默哀是来自动的为某些热点页建立哈希索引。
AHI有一个要求,即对这个页的连续访问模式必须是一样的,例如:
对于(a,b)这样的联合索引页,其访问模式可以是以下情况:
where a=xxx
where a=xxx and b=xxx
这里说的访问模式一样是指查询的条件一样,若交替进行上述两种查询,那么innodb存储引擎不会对该页构造AHI,因此AHI还有如下的要求:
*以该模式访问了100次,
*页通过该模式访问了N次,其中N=页中记录 *1/16
据官方文档,启用AHI后,读取和写入速度可以提高2倍,辅助索引的连续操作性能可以提高5倍,
注意:哈希索引只能用来搜索等值的查询。范围查询是不能使用哈希索引的。
innodb引擎的三大特性,插入缓冲(change buffer),两次写(doule write),自适应哈希索引(AHI)相关推荐
- Mysql关键特性-插入缓冲 (Insert Buffer)
1.什么是插入缓冲 (Insert Buffer insert buffer是一种特殊的数据结构(B+ tree)并不是缓存的一部分,而是物理页,这里讲的缓冲是针对的非聚集索引并且索引不是唯一的. 对 ...
- 【MySQL】Innodb存储引擎关键特性之——自适应哈希索引和异步IO
自适应哈希索引(AHI) 问题背景 众所周知,Innodb存储引擎索引底层数据结构是B+树,而B+树查找的时间复杂度取决于B+树的高度.而有一种数据结构,它查找的时间复杂度是O(1),那就是--数组. ...
- 什么是Mysql的next-key、插入缓冲、二次写、自适应哈希索引和预读
目录 楔子 一.间隙锁(Next-Key锁) 二.插入缓冲(Insert Buffer) 2.1.什么是insert buffer? 2.2.insert buffer的触发条件? 2.3.为什么不能 ...
- mysql双写缓冲_MYSQL-写缓冲(change buffer)
(1)MySQL数据存储包含内存与磁盘两个部分: (2)内存缓冲池(buffer pool)以页为单位,缓存最热的数据页(data page)与索引页(index page): (3)InnoDB以变 ...
- 数据库面试题【十一、InnoDB引擎的4大特性】
1.插入缓冲(insert buffer) 2.二次写(double write) 3.自适应哈希索引(ahi) 4.预读(read ahead)
- [MySQL] InnoDB三大特性之 - 插入缓冲
InnoDB存储引擎有三大特性非常令人激动,它们分别是插入缓冲.两次写和自适应哈希,本篇文章先介绍第一个特性 - 插入缓冲(insert buffer) 在上一篇<MySQL - 浅谈InnoD ...
- 十一. MySQL InnoDB 三大特性之 BufferPool
目录 一. BufferPool BufferPool基础与内部几个链表的解释 1. free链表 磁盘页加载到BufferPool的缓存流程 2. hash表 3. flush链表 flush 写入 ...
- InnoDB学习笔记一引擎架构及特性
文章目录 一.InnoDB引擎架构 1.1 InnoDB架构图 1.2 InnoDB的一个多线程模型 1.2.1 Master Thread - 核心线程 1.0.x版本之前的Master Threa ...
- mysql特点_Mysql 三大特性详解
Mysql Innodb后台线程 工作方式 首先Mysql进程模型是单进程多线程的.所以我们通过ps查找mysqld进程是只有一个. 体系架构 InnoDB存储引擎的架构如下图所以,是由多个内存块组成 ...
- mysql 5.7 io 性能 aio_深入理解MySQL的InnoDB引擎
在MySQL中的引擎一文中说了,我们在几乎所有的情况下其实用的都是InnoDB引擎,这里我们就重点再看一下这个引擎,包括他的存储结构,线程模型和数据文件. 我们可以通过show engine inno ...
最新文章
- python装饰器作用-Python 装饰器的作用
- 2016年10月CPU天梯图
- 值得一读的《框架设计(第2版):CLR Via C#》
- web第一节2020.5.11
- fiddler几种功能强大的用法(一)转自:http://www.cnblogs.com/chenshaoping/p/5785010.html
- 记AELF区块链网络的一次内存持续增长问题排查
- 漏洞 立即留言_漏洞挖掘小白入坑指南
- 第二篇:操纵MySQL数据库(2) - 基于ORM思想的SQLAlchemy库
- map-based exploration of intrinsic shape differences and variability
- gitee创建ssh公钥
- visio连接线设置
- DOS原理和常用命令详解示例
- mac下查看.mobileprovision文件及钥匙串中证书.cer文件
- Spring Boot + Thymeleaf + Echarts 三维地图展示
- 干货必看|分销商城系统体系设计
- div设置行高后内容未垂直居中
- 皇氏集团迷途知返,但乳业市场还能接受它吗?
- 对emp表的一些查询操作
- python获取字符串首字母_Python中用startswith()函数判断字符串开头的教程
- 《Advice on how to read papers》---吴恩达CS230随堂笔记
热门文章
- android自己监听home键,Android中监听Home键的4种方法总结
- gmap 支持python吗_Python:地图上的标记标签使用gmap.marker_层使用hover_-tex选项不工作...
- Seek 策略以及在有 B 帧情况下的处理
- [转] ubuntu上安装 ibus Google拼音输入法
- 存储容量与地址空间的计算
- python Flask快速入门
- linux带page参数报错,Linux配置hugepage
- VUE打包图片,icon图标不显示解决方案
- python打印星号图案_Python使用for循环打印星号三角形实例
- Publish Over SSH 本地安装