您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

一文看懂mysql数据库Innodb内存结构和内存分配机制

时间:2019-11-04 10:04:42  来源:  作者:

多朋友可能会有许多关于Innodb如何使用内存的问题。我这里将简单介绍一下innodb内存结构,然后以innodb启动时的分配情况做一个解释。

一文看懂mysql数据库Innodb内存结构和内存分配机制

 


1、INNODB内存结构

一文看懂mysql数据库Innodb内存结构和内存分配机制

 

1.1、聚集索引与非聚集索引:

聚集索引:主键,有序,存储顺序与内存一致
非聚集索引:非主键,无序
聚集索引在叶子节点存储的是表中的数据
非聚集索引在叶子节点存储的是主键和索引列
使用非聚集索引查询出数据时,拿到叶子上的主键再去查到想要查找的数据。(拿到主键再查找这个过程叫做回表)

1.2、缓冲池:

缓冲池用于存放各种数据的缓存。Innodb总是将磁盘中的数据(数据库文件)按页(16K)读取到缓冲池,然后按最近最少使用算法(LRU)来保存缓冲池中的数据。如果数据库
文件需要修改,总是先修改在缓存池中的页(发生修改后,该页为脏页),然后按一定频率刷新到磁盘中。

1.3、insert buffer(插入缓冲):

使用条件:1.索引是辅助索引;2.索引不是唯一的。
也就是说,主键索引不使用插入缓冲。主键索引是聚集索引,插入是顺序的,执行效率比较高,就不借助缓冲了。
但是,当表中存在辅助索引(非聚集索引,非主键)时,不一定是顺序的了,这时需要离散的访问,插入性能会降低。
所以,对于非聚集索引的插入和更新操作,不是直接插入到索引页中,而是插入到缓冲中,再以一定频率执行插入缓冲和非聚集索引叶子节点的合并操作。
注:由于非主键索引叶子节点存的是主键和当前列值,所以使用非聚集索引查询时,先查辅助索引的那颗树找到对应的主键,再查主键索引的那颗树,会查两次,效率不高。

1.4、redo log(重做日志):

在事务提交的时候,Innodb会先把数据从磁盘中读到内存进行修改,然后把事务日志写到日志缓冲(log buffer),然后再刷新到重做日志文件(redo log file)中进行持久化,
然后再定期刷新到磁盘中。
用于在实例故障恢复时,继续那些已经commit但数据尚未完全回写到磁盘的事务。

1.5、double write(两次写):

为防止redo log在写的过程中损坏,我们需要留个备份。若出现故障,先从备份中恢复redo log,再进行数据恢复。

1.6、undo log:

记录数据修改前的镜像,用于将未提交的事务回滚到事务开始前的状态。
undo操作:当Innodb存储引擎回滚时,它实际上做的是与之前相关的工作,对于insert操作,Innodb会完成一个delete,对于update,则会执行一个相反的update,将修改
前的行放回去。

1.7、自适应哈希索引:

Innodb会监控表上索引的查找频率,若发现建立哈希索引会提升速度,则自动创建哈希索引。不是对整张表建立索引,而是根据访问频率对某些页建立。

1.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内存结构和内存分配机制

 

  1. innodb_buffer_pool_size
  2. innodb_additional_mem_pool_size
  3. innodb_log_buffer_size
  4. adaptive index hash ,size (innodb buffer 索引管理区)= innodb_buffer_pool_size/64
  5. system dictionary hash,size(innodb内部字典区) = 6 * innodb_buffer_pool_size/512
  6. memory for sync_array,size(用于Innodb内部syncronzation的开销)=OS_THREAD * 512
  7. memory for os_event,size(用于innodb内存的syncronzation的开销)=OS_THREAD * 216
  8. memory for locking system(内存的锁管理系统),size = 5 * 4 *NBBLOCKS

4、innodb内存使用的计算公式为:

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

OS_THREADS * 368 = 17.5 MB if innodb_buffer_pool_size > 1000MB
OS_THREADS * 368 = 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最根本最需要多少内存,这样对于服务器的内存使用也可以有一个规划了。



Tags:mysql Innodb   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关推荐
总结下之前看到的一些关于MySQL索引原理的内容,好记性不如烂笔头。1. B+树我们知道InnoDB的索引是以B+树的形式组织的。B+树是一种树数据结构,是一个n叉树,每个节点通常有多个...【详细内容】
2020-11-10  Tags: mysql Innodb  点击:(53)  评论:(0)  加入收藏
多朋友可能会有许多关于Innodb如何使用内存的问题。我这里将简单介绍一下innodb内存结构,然后以innodb启动时的分配情况做一个解释。 1、INNODB内存结构 1.1、聚集索引与非聚...【详细内容】
2019-11-04  Tags: mysql Innodb  点击:(100)  评论:(0)  加入收藏
概述今天主要看下innodb是怎么去设计主键索引的,这里引用了一个淘宝MySQL数据库经典案例。 innodb 主键索引在Innodb中,聚簇索引默认就是主键索引。如果没有主键,则按照下列规...【详细内容】
2019-10-22  Tags: mysql Innodb  点击:(83)  评论:(0)  加入收藏
欢迎关注头条号:Java小野猫如果有人问你“数据库事务有哪些特性”?你可能会很快回答出原子性、一致性、隔离性、持久性即ACID特性。那么你知道InnoDB如何保证这些事务特性的...【详细内容】
2019-10-10  Tags: mysql Innodb  点击:(59)  评论:(0)  加入收藏
▌简易百科推荐
前言在之前我们已经讲解了一主一从,双主双从的mysql集群搭建,在单机应用的时候看起来没有问题,但是在企业的生产环境中,在很多情况下都会有复制延迟的问题。所以我来了!!!​ 主从复...【详细内容】
2021-07-15  灯灯灯灯111    Tags:主从复制   点击:(2)  评论:(0)  加入收藏
集群服务部署1、配置主库映射文件 键名mysqld.cnf## The Percona Server 5.7 configuration file.### * IMPORTANT: Additional settings that can override those from...【详细内容】
2021-07-15  富集云科技有限公司    Tags:Rancher   点击:(3)  评论:(0)  加入收藏
数据库MYSQL的查询一、单表查询1、条件查询select *from test where name='libai'①查询名字为李白且年龄为18:select *from test where name='libai' and a...【详细内容】
2021-07-14  切勿按键伤人    Tags:MYSQL   点击:(3)  评论:(0)  加入收藏
这篇文章主要给大家介绍了关于MySQL 8.0新特性之隐藏字段的相关资料,文中通过示例代码介绍得非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编...【详细内容】
2021-07-12  开心一刻成长每一天    Tags:MySQL   点击:(3)  评论:(0)  加入收藏
一、目前数据库服务器情况概述两台数据库服务器,分别为主、备数据库服务器,已做数据库镜像,数据实时同步,保证数据一致性;当主服务器故障时,可以在10秒钟内自动切换至备用数据库服...【详细内容】
2021-07-09  网络管理员老高    Tags:数据库   点击:(6)  评论:(0)  加入收藏
【目标】本文介绍了MySQL数据库命令规范、数据库基本设计规范、数据库字段设计规范、索引设计规范、常见索引列建议、如何选择索引列的顺序、以及数据库SQL开发规范等。一...【详细内容】
2021-07-08  程序不就是0和1    Tags:数据库运维   点击:(3)  评论:(0)  加入收藏
安装mysqlsudo apt-get updatesudo apt-get install mysql-server输出:Reading package lists... DoneBuilding dependency treeReading state information... DoneThe follo...【详细内容】
2021-07-05  爱玩的安哥    Tags:Mysql5.7   点击:(10)  评论:(0)  加入收藏
1 背景介绍我们在数据库运维的过程中.会遇到不同版本的数据库部署需求.同时测试环境数据库需求更是不同.有时为了节省资源.我们需要进行多实例的部署.或者在我们自己学习的...【详细内容】
2021-07-05  智明杂谈  今日头条  Tags:MySQL   点击:(10)  评论:(0)  加入收藏
为什么需要索引? 一句话概括:索引的出现其实就是为了提高数据查询的效率。一、索引常见模型模型: 哈希表、有序数组和搜索树哈希表 哈希表是一种以键 - 值(key-value)存储数据的...【详细内容】
2021-07-04  Java架构师联盟  今日头条  Tags:MySQL   点击:(12)  评论:(0)  加入收藏
不想把mysql端口暴露在公网?在naviCat里可以通过ssh连接mysql。连接设置: 使用SSH通道,主机名或IP地址填写该mysql服务器地址 验证方式:公钥。注:在此之前,需要在服务器上设置好用...【详细内容】
2021-07-03  老IT的技术生活  今日头条  Tags:Mysql   点击:(5)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条