您当前的位置:首页 > 电脑百科 > 数据库 > 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   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
总结下之前看到的一些关于MySQL索引原理的内容,好记性不如烂笔头。1. B+树我们知道InnoDB的索引是以B+树的形式组织的。B+树是一种树数据结构,是一个n叉树,每个节点通常有多个...【详细内容】
2020-11-10  Tags: mysql Innodb  点击:(120)  评论:(0)  加入收藏
多朋友可能会有许多关于Innodb如何使用内存的问题。我这里将简单介绍一下innodb内存结构,然后以innodb启动时的分配情况做一个解释。 1、INNODB内存结构 1.1、聚集索引与非聚...【详细内容】
2019-11-04  Tags: mysql Innodb  点击:(145)  评论:(0)  加入收藏
概述今天主要看下innodb是怎么去设计主键索引的,这里引用了一个淘宝MySQL数据库经典案例。 innodb 主键索引在Innodb中,聚簇索引默认就是主键索引。如果没有主键,则按照下列规...【详细内容】
2019-10-22  Tags: mysql Innodb  点击:(125)  评论:(0)  加入收藏
欢迎关注头条号:Java小野猫如果有人问你“数据库事务有哪些特性”?你可能会很快回答出原子性、一致性、隔离性、持久性即ACID特性。那么你知道InnoDB如何保证这些事务特性的...【详细内容】
2019-10-10  Tags: mysql Innodb  点击:(105)  评论:(0)  加入收藏
▌简易百科推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  爱可生    Tags:MySQL   点击:(7)  评论:(0)  加入收藏
生成间隙(gap)锁、临键(next-key)锁的前提条件 是在 RR 隔离级别下。有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章...【详细内容】
2021-12-14  python数据分析    Tags:MySQL记录锁   点击:(18)  评论:(0)  加入收藏
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二...【详细内容】
2021-12-14  linux上的码农    Tags:mysql   点击:(13)  评论:(0)  加入收藏
为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查...【详细内容】
2021-12-09  元宇宙iwemeta    Tags:mysql   点击:(15)  评论:(0)  加入收藏
测试的目的和原因,公司有很多程序员,每个程序员对数据库和表结构都有自己的理解。而且每个程序员的理解往往是以效率考虑。既然都是为了效率考虑,那么我就来测试一下究竟哪种使...【详细内容】
2021-12-08  吴彬的分享    Tags:Mysql数据库   点击:(14)  评论:(0)  加入收藏
当你们考虑项目并发的时候,我在部署环境,当你们在纠结使用ArrayList还是LinkedArrayList的时候,我还是在部署环境。所以啊,技术不止境,我在部环境。今天这篇文章缕一下在同一台服...【详细内容】
2021-12-08  秃头码哥    Tags:MySQL数据库   点击:(17)  评论:(0)  加入收藏
对于数据分析来说,MySQL使用最多的是查询,比如对数据进行排序、分组、去重、汇总及字符串匹配等,如果查询的数据涉及多个表,还需要要对表进行连接,本文就来说说MySQL中常用的查询...【详细内容】
2021-12-06  笨鸟学数据分析    Tags:MySQL   点击:(21)  评论:(0)  加入收藏
在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL Server等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。...【详细内容】
2021-11-24  笨鸟学数据分析    Tags:SQL语句   点击:(23)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Java云海    Tags:分布式锁   点击:(32)  评论:(0)  加入收藏
MySQL的进阶查询 一、 按关键字排序 使用ORDERBY语句来实现排序排序可针对一个或多个字段ASC:升序,默认排序方式 【升序是从小到大】DESC:降序 【降序是从大到小】ORDER BY的...【详细内容】
2021-11-05  Java热点    Tags:SQL语句   点击:(28)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条