加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

详解MySQL数据库Innodb内存布局和其是怎样行使内存的?

发布时间:2019-11-04 21:17:45 所属栏目:编程 来源:波波说运维
导读:概述 许多伴侣也许会有很多关于Innodb怎样行使内存的题目。我这里将简朴先容一下innodb内存布局,然后以innodb启动时的分派环境做一个表明。 1. INNODB内存布局 (1) 聚积索引与非聚积索引: 聚积索引:主键,有序,存储次序与内存同等 非聚积索引:非主键
副问题[/!--empirenews.page--]

概述

许多伴侣也许会有很多关于Innodb怎样行使内存的题目。我这里将简朴先容一下innodb内存布局,然后以innodb启动时的分派环境做一个表明。

详解mysql数据库Innodb内存布局和其是怎样行使内存的?

1. INNODB内存布局

详解mysql数据库Innodb内存布局和其是怎样行使内存的?

(1) 聚积索引与非聚积索引:

聚积索引:主键,有序,存储次序与内存同等

非聚积索引:非主键,无序

  • 聚积索引在叶子节点存储的是表中的数据
  • 非聚积索引在叶子节点存储的是主键和索引列
  • 行使非聚积索引查询出数据时,拿到叶子上的主键再去查到想要查找的数据。(拿到主键再查找这个进程叫做回表)

(2) 缓冲池:

缓冲池用于存放各类数据的缓存。Innodb老是将磁盘中的数据(数据库文件)按页(16K)读取到缓冲池,然后按最近起码行使算法(LRU)来生涯缓冲池中的数据。

假如数据库文件必要修改,老是先修改在缓存池中的页(产生修改后,该页为脏页),然后按必然频率革新到磁盘中。

(3) insert buffer(插入缓冲):

行使前提:1.索引是帮助索引;2.索引不是独一的。

也就是说,主键索引不行使插入缓冲。主键索引是聚积索引,插入是次序的,执行服从较量高,就不借助缓冲了。

可是,当表中存在帮助索引(非聚积索引,非主键)时,不必然是次序的了,这时必要离散的会见,插入机能会低落。

以是,对付非聚积索引的插入和更新操纵,不是直接插入到索引页中,而是插入到缓冲中,再以必然频率执行插入缓冲和非聚积索引叶子节点的归并操纵。

注:因为非主键索引叶子节点存的是主键和当火线值,以是行使非聚积索引查询时,先查帮助索引的那颗树找到对应的主键,再查主键索引的那颗树,会查两次,服从不高。

(4) redo log(重做日记):

在事宜提交的时辰,Innodb会先把数据从磁盘中读到内存举办修改,然后把事宜日记写到日记缓冲(log buffer),然后再革新到重做日记文件(redo log file)中举办耐久化,然后再按期革新到磁盘中。

用于在实例妨碍规复时,继承那些已经commit但数据尚未完全回写到磁盘的事宜。

(5) double write(两次写):

为防备redo log在写的进程中破坏,我们必要留个备份。若呈现妨碍,先从备份中规复redo log,再举办数据规复。

(6) undo log:

记录数据修改前的镜像,用于将未提交的事宜回滚到事宜开始前的状态。

undo操纵:当Innodb存储引擎回滚时,它现实上做的是与之前相干的事变,对付insert操纵,Innodb会完成一个delete,对付update,则会执行一个相反的update,将修改前的行放归去。

(7) 自顺应哈希索引:

Innodb会监控表上索引的查找频率,若发明成立哈希索引会晋升速率,则自动建设哈希索引。不是对整张表成立索引,而是按照会见频率对某些页成立。

(8) 事宜提交:

事宜举办进程中,每次sql语句执行,城市记录undo log和redo log,然后更新数据形成脏页。然后redo log凭证时刻或空间等前提举办落盘,undo log和脏页凭证checkpoint举办落盘,落盘后响应的redo log就可以删除了。

此时,事宜还未commit,假如产生瓦解,则起首搜查checkpoint记录,行使响应的redo log举办数据和undo log的规复,然后查察undo log的状态发明事宜尚未提交,然后就行使undo log举办回滚。事宜执行commit操纵时,会将才干务相干的全部redo log都举办落盘,只有全部redo log落盘乐成,才算commit乐成。

然后内存中的数据脏页继承凭证checkpoint举办落盘。假云云时产生了瓦解,则只行使redo log规复数据。

2. 一些重要的观念:

  • NBLOCKS=Innodb_buffer_pool有多个页(block)=innodb_buffer_pool_size/16384(16k)
  • OS_THREADS= if ( innodb_buffer_pool_size >= 1000Mb) = 50000
  • else if (innodb_buffer_pool_size >= 8Mb) = 10000
  • else = 1000 (该值只用在*nixes体系上,对付Windows有一点小的区别计较OS_THREADS)

3. Innodb 行使的内存包罗:

详解mysql数据库Innodb内存布局和其是怎样行使内存的?

  • innodb_buffer_pool_size
  • innodb_additional_mem_pool_size
  • innodb_log_buffer_size
  • adaptive index hash ,size (innodb buffer 索引打点区)= innodb_buffer_pool_size/64
  • system dictionary hash,size(innodb内部字典区) = 6 * innodb_buffer_pool_size/512
  • memory for sync_array,size(用于Innodb内部syncronzation的开销)=OS_THREAD * 512
  • memory for os_event,size(用于innodb内存的syncronzation的开销)=OS_THREAD * 216
  • memory for locking system(内存的锁打点体系),size = 5 * 4 *NBBLOCKS

4. innodb内存行使的计较公式为:

  1. Innodb_buffer_pool_size + innodb_log_buffer_size + innodb_additional_mem_pool_size + 812/16384 * innodb_buffer_pool_size + OS_THREADS * 368 

对付812/16384 * Innodb_buffer_pool_size 可以简朴的用 innodb_buffer_pool_size / 20 计较,对付OS_THREADS * 368

  1. OS_THREADS * 368 = 17.5 MB if innodb_buffer_pool_size > 1000MB 
  2. OS_THREADS * 3368 = 3.5 MB if innodb_buffer_pool_size > 8MB 

举一个例子:

假如你的innodb_buffer_pool_size有1500MB,innodb_additional_mem_pool_size =20 MB,innodb_log_buffer_size = 8M,

Innodb 将会向体系申请内存为= 1500M + 20M + 8M + 1500/20 M +17.5 = 1620.5M

按照以上的前提可以算出Innodb最基础最必要几多内存,这样对付处事器的内存行使也可以有一个筹划了。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读