`
annan211
  • 浏览: 460819 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

MySQL InnoDB三大特性之 - 插入缓冲

 
阅读更多


InnoDB存储引擎有三大特性非常令人激动,它们分别是插入缓冲、两次写和自适应哈希,本篇文章先介绍第一个特性 - 插入缓冲(insert buffer)
在上一篇《MySQL - 浅谈InnoDB存储引擎》中,我们可以看到在InnoDB的内存中有单独一块叫“插入缓冲”的区域,下面我们详细来介绍它。
  请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
非聚集索引写性能问题
为了阐述非聚集索引写性能问题,我们先来看一个例子:

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

  请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
我们创建了一个表,表的主键是id,id列式自增长的,即当执行插入操作时,id列会自动增长,页中行记录按id顺序存放,不需要随机读取其它页的数据。因此,在这样的情况下(即聚集索引),插入操作效率很高。
但是,在大部分应用中,很少出现表中只有一个聚集索引的情况,更多情况下,表上会有多个非聚集的secondary index (辅助索引)。比如,对于上一张表t,业务上还需要按非唯一的name字段查找,则表定义改为:
  请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
mysql>create table t (
           id int auto_increment,
           name varchar(30),
           primary key (id),
           key (name));

这时,除了主键聚合索引外,还产生了一个name列的辅助索引,对于该非聚集索引来说,叶子节点的插入不再有序,这时就需要离散访问非聚集索引页,插入性能变低。
  请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
插入缓冲技术机制
为了解决这个问题,InnoDB设计出了插入缓冲技术,对于非聚集类索引的插入和更新操作,不是每一次都直接插入到索引页中,而是先插入到内存中。具体做法是:如果该索引页在缓冲池中,直接插入;否则,先将其放入插入缓冲区中,再以一定的频率和索引页合并,这时,就可以将同一个索引页中的多个插入合并到一个IO操作中,大大提高写性能。回忆一下在《MySQL - 浅谈InnoDB存储引擎》中提到的master thread主循环其中的一项工作就是每秒中合并插入缓冲(可能)。
这个设计思路和HBase中的LSM树有相似之处,都是通过先在内存中修改,到达一定量后,再和磁盘中的数据合并,目的都是为了提高写性能,具体可参考《HBase LSM树》,这又再一次说明,学到最后,技术都是相通的。

插入缓冲的启用需要满足一下两个条件:
1)索引是辅助索引(secondary index)
2)索引不适合唯一的
如果辅助索引是唯一的,就不能使用该技术,原因很简单,因为如果这样做,整个索引数据被切分为2部分,无法保证唯一性。
只要实现上面两个条件,Innodb存储引擎会使用插入缓冲。
  请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
show engine innodb status;可以查看当前插入缓冲大小,seg size 表示当前插入缓冲大小。具体大小为 seg size*16KB

插入缓冲带来的问题
任何一项技术在带来好处的同时,必然也带来坏处。插入缓冲主要带来如下两个坏处:
1)可能导致数据库宕机后实例恢复时间变长。如果应用程序执行大量的插入和更新操作,且涉及非唯一的聚集索引,一旦出现宕机,这时就有大量内存中的插入缓冲区数据没有合并至索引页中,导致实例恢复时间会很长。
2)在写密集的情况下,插入缓冲会占用过多的缓冲池内存,默认情况下最大可以占用1/2,这在实际应用中会带来一定的问题。
  请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
percona已经发布一些补丁来修复,修改IBUF_POOL_SIZE_PER_MAX_SIZE修改为3 ,则插入缓冲占用缓冲池大小会下降到1/3.


 

分享到:
评论

相关推荐

    MySQL体系结构及原理(innodb)图文完美解析

    - 插入一条记录时,InnoDB通常会首先将新数据放入缓冲池(Buffer Pool),然后再异步刷新到磁盘,因此在大多数情况下不会立即产生物理I/O读操作。 - 更新操作同样会尽可能利用缓冲池来减少物理I/O操作。 5. **Merge...

    【mysql】InnoDB关键特性—插入缓冲

    【MySQL】InnoDB存储引擎的关键特性之一是插入缓冲(Insert Buffer),它对于提高数据库的插入性能至关重要,尤其是在处理大量辅助索引插入时。在深入理解插入缓冲之前,我们需要先了解InnoDB中的两种索引类型:聚集...

    mysql-installer-community-5.7.28.0.zip

    6. **性能提升**:在MySQL 5.7中,InnoDB存储引擎的性能得到了显著提升,包括更快的索引插入、更高效的查询处理和更大的缓冲池。 7. **InnoDB Plugin**:MySQL 5.7默认使用InnoDB存储引擎,提供了事务处理、行级...

    MySQL InnoDB 查询优化实现分析

    - **附录三**:探讨了 InnoDB 如何管理内存,包括缓冲池的使用等。 - **附录四**:列举了一些实际应用中的案例研究,展示了如何利用 InnoDB 的特性来解决具体的性能问题。 通过本文的详细解析,读者可以对 MySQL + ...

    mysql-installer-web-community-8.0.13.0安装包

    1. **增强性能**:MySQL 8.0通过改进查询优化器、引入InnoDB存储引擎的多线程插入缓冲区以及更快的索引构建,显著提高了数据库性能。这使得高并发场景下的数据处理更为流畅。 2. **窗口函数**:新增的窗口函数支持...

    mysql-5.5.33-linux2.6-x86_64.tar.gz

    MySQL是世界上最受欢迎的关系型数据库管理系统(RDBMS)之一,尤其在Web应用程序中广泛应用。这里的“mysql-5.5.33-linux2.6-x86_64.tar.gz”是一个针对Linux操作系统的MySQL服务器的压缩包,适用于x86_64(也称为...

    InnoDB的关键特性-插入缓存,两次写,自适应hash索引详解

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

    MySql innodb 引擎表存储分析

    - **插入缓冲空闲列表页** (Insert Buffer Free List Page):用于管理插入缓冲中的空闲页。 #### 创建新表的过程 当创建新表时,InnoDB初始分配32页的碎片页用于存放数据。这些页被称为“预分配”页。一旦这32页被...

    MySQL高级-第07章-InnoDB数据存储结构

    MySQL是世界上最流行的关系型数据库管理系统之一,其InnoDB存储引擎是默认且最常使用的引擎,尤其在事务处理和数据安全性方面表现出色。本章节将深入探讨InnoDB数据存储结构,帮助你理解其内部机制,提升数据库管理...

    mysql-installer-community-5.6.43.0.msi

    此外,InnoDB还增加了多线程的插入缓冲处理,提高了并发插入性能。 3. **分区功能增强**:允许在更多类型的表上使用分区,如非聚簇索引和视图,这有助于大型数据集的管理和查询。 4. **Full-Text Search改进**:...

    MySQL新特性 For innodb 8.0

    以上是MySQL 8.0 版本中InnoDB的主要新特性,它们极大地提升了MySQL在大数据、高性能和复杂查询场景下的表现,同时提供了更完善的管理和监控工具,使得数据库运维变得更加高效和便捷。对于开发者和数据库管理员来说...

    mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

    - **InnoDB存储引擎增强**:MySQL 5.7对InnoDB存储引擎进行了大量改进,包括更快的插入速度、更高的并发性和更小的数据文件占用空间。 - **JSON支持**:增加了对JSON数据类型的内置支持,允许用户在关系数据库中...

    一线大厂Mysql面试题详解.pdf

    * 插入缓冲(Insert Buffer):InnoDB引擎使用插入缓冲来提高插入操作的性能。 * 二次写(Double Write):InnoDB引擎使用二次写来确保数据的一致性。 * 自适应哈希索引(Adaptive Hash Index):InnoDB引擎使用...

    InnoDB性能调节提示

    MySQL的InnoDB存储引擎在处理大量数据和高并发事务时,其性能调优至关重要。以下是一些关于如何配置和优化InnoDB性能的关键提示: 1. **监控InnoDB状态**: 使用`SHOW INNODB STATUS`命令可以查看InnoDB引擎的状态...

    mysql-5.7.20-win32-debug-test.zip

    - 性能提升:5.7版本引入了InnoDB存储引擎的改进,如更好的缓冲池管理,更快的索引插入,提高了查询速度。 - JSON支持:新版本添加了对JSON数据类型的原生支持,允许在SQL查询中直接处理JSON格式的数据。 - 查询...

    mysql-installer-community-5.7.18.1.msi

    2. **InnoDB存储引擎**:MySQL 5.7对InnoDB进行了优化,支持更高的并发事务处理能力,提高了插入缓冲区大小,增强了行级锁定,使得多用户环境下的性能显著提升。此外,还增加了自适应哈希索引,用于快速访问经常访问...

    mysql-5.7.27-winx64 压缩包.zip

    MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,其5.7.27版本是一个稳定且功能丰富的版本。本文将深入探讨“mysql-5.7.27-winx64”压缩包及其在Windows 10 64位系统中的安装与配置。 一、MySQL 5.7.27 简介...

    mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz

    InnoDB存储引擎的性能得到增强,包括更高效的缓冲池管理,以及更好的并行插入策略。 2. **InnoDB存储引擎**:MySQL 5.6对InnoDB进行了大量改进,如支持自适应hash索引,这允许数据库自动创建hash索引来加速查询。...

    MySQL InnoDB小结1

    InnoDB是MySQL数据库中最常用的存储引擎之一,尤其在需要事务支持的应用中。本文将深入探讨InnoDB的特性和事务处理的ACID属性。 首先,事务是数据库操作的基础单元,它们确保了数据库操作的原子性、一致性、隔离性...

Global site tag (gtag.js) - Google Analytics