InnoDB存储引擎有三大特性非常令人激动,它们分别是插入缓冲、两次写和自适应哈希,本篇文章先介绍第一个特性 - 插入缓冲(insert buffer)

在上一篇《MySQL - 浅谈InnoDB存储引擎》中,我们可以看到在InnoDB的内存中有单独一块叫“插入缓冲”的区域,下面我们详细来介绍它。

非聚集索引写性能问题

为了阐述非聚集索引写性能问题,我们先来看一个例子:

mysql>create table t (
           id int auto_increment,
           name varchar(30),
           primary key (id));

我们创建了一个表,表的主键是id,id列式自增长的,即当执行插入操作时,id列会自动增长,页中行记录按id顺序存放,不需要随机读取其它页的数据。因此,在这样的情况下(即聚集索引),插入操作效率很高。

但是,在大部分应用中,很少出现表中只有一个聚集索引的情况,更多情况下,表上会有多个非聚集的secondary index (辅助索引)。比如,对于上一张表t,业务上还需要按非唯一的name字段查找,则表定义改为:

mysql>create table t (
           id int auto_increment,
           name varchar(30),
           primary key (id),
           key (name));

这时,除了主键聚合索引外,还产生了一个name列的辅助索引,对于该非聚集索引来说,叶子节点的插入不再有序,这时就需要离散访问非聚集索引页,插入性能变低。

插入缓冲技术机制

为了解决这个问题,InnoDB设计出了插入缓冲技术,对于非聚集类索引的插入和更新操作,不是每一次都直接插入到索引页中,而是先插入到内存中。具体做法是:如果该索引页在缓冲池中,直接插入;否则,先将其放入插入缓冲区中,再以一定的频率和索引页合并,这时,就可以将同一个索引页中的多个插入合并到一个IO操作中,大大提高写性能。回忆一下在《 MySQL - 浅谈InnoDB存储引擎》中提到的master thread主循环其中的一项工作就是每秒中合并插入缓冲(可能)。

这个设计思路和HBase中的LSM树有相似之处,都是通过先在内存中修改,到达一定量后,再和磁盘中的数据合并,目的都是为了提高写性能,具体可参考《HBase LSM树》,这又再一次说明,学到最后,技术都是相通的。

插入缓冲的启用需要满足一下两个条件:
1)索引是辅助索引(secondary index)
2)索引不适合唯一的
如果辅助索引是唯一的,就不能使用该技术,原因很简单,因为如果这样做,整个索引数据被切分为2部分,无法保证唯一性。

插入缓冲带来的问题

任何一项技术在带来好处的同时,必然也带来坏处。插入缓冲主要带来如下两个坏处:
1)可能导致数据库宕机后实例恢复时间变长。如果应用程序执行大量的插入和更新操作,且涉及非唯一的聚集索引,一旦出现宕机,这时就有大量内存中的插入缓冲区数据没有合并至索引页中,导致实例恢复时间会很长。
2)在写密集的情况下,插入缓冲会占用过多的缓冲池内存,默认情况下最大可以占用1/2,这在实际应用中会带来一定的问题。

[MySQL] InnoDB三大特性之 - 两次写

[MySQL] InnoDB三大特性之 - 自适应哈希索引

[MySQL] InnoDB三大特性之 - 插入缓冲相关推荐

  1. 十一. MySQL InnoDB 三大特性之 BufferPool

    目录 一. BufferPool BufferPool基础与内部几个链表的解释 1. free链表 磁盘页加载到BufferPool的缓存流程 2. hash表 3. flush链表 flush 写入 ...

  2. InnoDB关键特性之插入缓冲

    Insert Buffer:主要用于提高非聚集索引的插入和更新性能 聚集索引和非聚集索引 聚集索引就是数据索引按照索引排序,且内容也是顺序存储(等价于汉语字典按照拼音索引排序) 非聚集索引索引项按照顺 ...

  3. mysql的三大特性_【mysql】Innodb三大特性之double write

    1.doublewrite buffer(mysql官方的介绍) InnoDB uses a novel file flush technique called doublewrite. Before ...

  4. 【mysql】Innodb三大特性之double write

    1.doublewrite buffer(mysql官方的介绍) InnoDB uses a novel file flush technique called doublewrite. Before ...

  5. mysql innodb 存储引擎

    --MySQL 结构有两部分组成 1.MySQL server 层 2.存储引擎层 --注:到 存储引擎层之前都属于 MySQL server 层 MySQL 5.1到 5.7 ,大版本 没有变化 , ...

  6. mysql特点_Mysql 三大特性详解

    Mysql Innodb后台线程 工作方式 首先Mysql进程模型是单进程多线程的.所以我们通过ps查找mysqld进程是只有一个. 体系架构 InnoDB存储引擎的架构如下图所以,是由多个内存块组成 ...

  7. mysql 插入缓冲

    在看<mysql技术内幕:innodb存储引擎>看到插入缓冲,google了一下,发现如下解释: 摘录自:http://www.itpub.net/viewthread.php?tid=1 ...

  8. MySQL如何生成idf文件_【IDF2010】释放三大特性 至强7500为MySQL量身定做

    我们曾经总结一般的数据库服务器在选型时的主要需求(详见:数据库服务器选型原则及实例解说),并探讨了如何选择Oralce数据库服务器(详见:x86渐热 Oracle数据库服务器选型指南).本期我们将从M ...

  9. 按顺序插入图片_MysqlInnodb特性之插入缓存

    InnoDB存储引擎的关键特性包括插入缓冲.两次写(double write).自适应哈希索引(adaptive hash index).这些特性为InnoDB存储引擎带来了更好的性能和更高的可靠性. ...

最新文章

  1. ubuntu nohup php,Ubuntu安装PhpStorm并设置快速启动phpstorm
  2. 给Android Studio设置代码字体大小与界面字体样式
  3. MySQL—表的完整性约束(外键约束)(二)
  4. python3.9出了吗_Python 3.9 正式版要来了,会有哪些新特性?
  5. AI基础:词嵌入基础和Word2vec
  6. shiro之自定义realm
  7. 怎样实现一个简单的jQuery编程
  8. jsp_el内置对象pageContext和Cookie
  9. android真实项目教程(七)——梦醒边缘花落_by_CJJ
  10. select case when与IF的用法
  11. expdp,impdp实现oracle备份及导入(一)
  12. 快速排序 与 归并排序
  13. 2.3 Hightway Networks
  14. No qualifying bean of type;Unsatisfied dependency expressed through field 解决办法(总结全网)
  15. python pyqt5教程pdf_PyQt5中文手册
  16. OPPO R9tm 刷机/root/救砖/第三方recovery
  17. 找到某个关键字 同义词词林 python_3.6 什么是LSI关键字?为什么它对SEO很重要?...
  18. roundcube邮箱手机端_用户换了手机号码后,产品该如何应对?
  19. 朽木第一至三季/全集Deadwood迅雷下载
  20. C++操作Excel表格

热门文章

  1. 大数据之-Hadoop3.x_MapReduce_ReduceJoin案例Reducer_案例_Debug调试---大数据之hadoop3.x工作笔记0132
  2. ES6新特性_Promise封装Ajax请求---JavaScript_ECMAScript_ES6-ES11新特性工作笔记026
  3. Netty工作笔记0056---Unpooled应用实例2
  4. RocketMq学习笔记001---Kafka,ActiveMQ、RabbitMQ、RocketMQ消息中间件的对比
  5. Android学习笔记---android平台中利用,SAX解析xml
  6. 2015年3月31号日志
  7. visual studio 使用快捷方法2
  8. mysql 表字段部分替换
  9. 动态创建TXMLDocument--使用IXMLDocument接口
  10. linux下的C语言开发(静态库)