InnoDB深入理解

原创 2015年11月21日 17:38:59

InnoDB体系架构 (存储引擎内存池,后台现成)

简单的将就是两个部分,一个是一个存储引擎内存池,还有一个就是有很多个后台线程,具体的讲是7个,4个IO线程 1个主要线程,1个锁监控线程,1个错误监控线程,四个IO分别是插入缓冲,日志 读 写。

存储引擎内存池具体的说是一个缓冲池,重做日志缓冲池,以及额外的内存池三个部分。一般缓冲池的大小是最大的,重做日志缓冲池和额外内存池比较小。

缓冲池主要是用来存放各种数据,这个地方牵扯到了InnoDB工作方式,就是将数据库文件按页读取到缓冲池,如果数据库文件需要修改,也是先修改缓冲池,然后刷新到文件的。

一般缓冲池中存放的是索引页,数据页,还有插入缓冲,自适应哈希索引,InnoDB的锁信息,数据字典等。

重做日志缓冲池,一般是将重做日志信息放到这个缓冲区中,然后按照一定频率将其刷新到文件。

额外内存缓冲池也很重要,对一些数据结构本身分配内存时,需要从额外缓冲池中分配。

综上,我们可以归纳出InnoDB体系结构

1.存储引擎池,

a) 缓冲池,用来缓存各种数据,索引,数据,锁的信息,错误信息等

b) 重做日志缓冲池,重做日志信息会放到这个缓冲池中,然后刷新到日志文件

c) 额外内存缓冲池,数据结构本身信息存放。

2. 7个线程

a) 4个IO线程 插入缓冲 读 写 日志

b) 1个锁监控线程

c) 1个错误监控线程

d) 1个主要线程

InnoDB的关键特性 (插入缓冲 两次写 自适应哈希)

1.插入缓冲,主要是针对非主键索引的插入和更新操作,如果是主键索引,顺序的插入就可以了,数据页的存放还是主键id的执行顺序,但是非主键索引,叶子节点的插入不再是顺序的,这个时候需要离散的访问非聚集索引,插入性能会变得很低。

插入缓冲的作用就是,对于非聚集索引的插入和更新,不是每一次直接插入索引页中,而是先判断非聚集索引页是否里,如果存在,那么直接插入,不存在就先插入到缓冲池中,然后以一定的频率合并缓冲区和索引页。

插入缓冲使用满足两个条件,1,非聚集索引, 2,索引不是唯一的

插入缓冲存在一个问题,在写密集的时候,插入缓冲会占用过多缓冲池内存,默认情况下最大可以占用1/2缓冲池内存。

2.两次写

如果说插入缓冲给InnoDB带来的是性能,那么两次写给InnoDB带来的就是数据的可靠性,如果在写一个页的时候,服务器宕机,那么就会导致这个页只写了一部分的情况,我们称这种情况叫做写失效,两次写就是准备一个副本,当写失效的时候,通过写副本来恢复原来的数据,在进行重做,至于如果进行,InnoDB存储引擎提供了一个两次写缓冲,大小为2M,另一个就是物理磁盘上共享表空间中连续的128个页。

当操作系统将页写入磁盘的时候宕掉了,那么在恢复过程中,InnoDB存储引擎可以从共享表空间中的doublewrite中找到该页的副本,然后将副本拷贝到表空间,在做重用日志。

3.自适应哈希索引

哈希是一种非常快的查找方法。官方的数据是,使用自适应哈希索引后,读取和写入数据可以提高2倍,对于辅助索引的的链接操作,性能可以提高至5倍


版权声明:本文为博主原创文章,未经博主允许不得转载。

InnoDB---深入理解事务提交--01

http://blog.163.com/li_hx/blog/static/1839914132016112991511518/ 当事务正常执行结束时,事务的提交操作,是实现事务...
  • yanzongshuai
  • yanzongshuai
  • 2016年12月31日 20:58
  • 941

InnoDB与Myisam的六大区别

MyISAM      InnoDB      构成上的区别:      每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。   .frm文件存储...
  • paul342
  • paul342
  • 2015年10月24日 09:35
  • 1942

深入理解Servlet

简介  Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Ser...
  • u010926964
  • u010926964
  • 2016年01月28日 15:57
  • 1866

深入理解Spring系列之一:开篇

Spring经过大神们的构思、编码,日积月累而来,所以,对其代码的理解也不是一朝一夕就能快速完成的。源码学习是枯燥的,需要坚持!坚持!坚持!当然也需要技巧,第一遍学习的时候,不用关注全部细节,不重要的...
  • tianruirui
  • tianruirui
  • 2016年10月30日 20:18
  • 2370

[深入理解Android卷一 全文-第二章]深入理解JNI

由于《深入理解Android 卷一》和《深入理解Android卷二》不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容。(出版社排版好的PDF版正...
  • Innost
  • Innost
  • 2015年08月02日 09:39
  • 10172

深入了解MySQL的索引(一)

(一)关于存储引擎               创建合适的索引是SQL性能调优中最重要的技术之一。在学习创建索引之前,要先了解MySql的架构细节,包括在硬盘上面如何组织的,索引和内存用法和操作方式,...
  • qq_27291877
  • qq_27291877
  • 2015年05月06日 21:42
  • 596

深入理解MySQL的索引(二)

MySQL实现        对B-树,B+树和散列等数据结构的基本概念有了一些了解之后,我们就可以开始讨论MySQL通过支持它们的存储引擎如何实现不同的算法。同时每种实现也对磁盘和内存使用情况有不...
  • qq_27291877
  • qq_27291877
  • 2015年05月07日 19:27
  • 696

Java 深入理解与感悟

Java 不仅仅是一门编程语言,它还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统,移动终端,企业服务器和大型机等各种...
  • architect_zero
  • architect_zero
  • 2016年07月27日 00:11
  • 441

《深入理解C++对象模型》读书笔记(一)

1、           C++类对象模型的中包括非静态成员变量和虚函数表指针,其他静态成员变量和成员函数均放在对象模型之外,所有的对象示例均可以共同使用。如此可以节省访问的时间和空间效率。   ...
  • zhiren2011
  • zhiren2011
  • 2015年07月31日 10:49
  • 1068

深入了解Redis

本文将主要从Redis适用范围,与Memcached, Java容器对比,核心功能(Pipelining,Pub/Sub,LRU,Transactions, Persistence, Replicat...
  • ErixHao
  • ErixHao
  • 2016年08月16日 22:56
  • 3971
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:InnoDB深入理解
举报原因:
原因补充:

(最多只允许输入30个字)