首页 > 编程知识 正文

mysql数据库类型(mysql查innodb)

时间:2023-05-03 06:54:54 阅读:1234 作者:4427

00-1010关于Innodb如何使用内存,很多朋友可能会有很多疑问。这里我简单介绍一下innodb的内存结构,然后说明innodb在启动时的分配。

概述

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

聚集索引:主键,有序,存储顺序与内存一致。

非聚集索引:非主键,无序。

索引将数据存储在叶节点的表中。

非聚集索引在叶节点存储主键和索引列。

使用非聚集索引查询数据时,获取叶上的主键,然后查找要查找的数据。(获取主键并再次搜索的过程称为返回表)

1.2.缓冲池:

缓冲池用于存储各种数据缓存。Innodb总是逐页(16K)将数据(数据库文件)从磁盘读入缓冲池,然后根据最近最少使用的算法(LRU)将数据保存在缓冲池中。如果数据库

如果一个文件需要修改,一定要先修改缓存池中的页面(修改后页面是脏的),然后以一定的频率刷新到磁盘。

1.3、插入缓冲区(insert buffer):

使用条件:1。索引是辅助索引;2.索引不是唯一的。

即主键索引不使用插入缓冲区。主键索引是聚集索引,插入是顺序的,执行效率比较高,不需要缓冲。

但是当表中有辅助索引(非聚集索引、非主键)时,不一定是顺序的,需要离散访问,插入性能会降低。

因此,插入和更新非聚集索引的操作不是直接插入索引页,而是插入缓冲区,然后以一定的频率执行插入缓冲区和非聚集索引的叶节点的合并操作。

注意:因为非主键索引的叶节点存储主键和当前列值,所以在使用非聚集索引查询时,首先要检查辅助索引的树,找到对应的主键,然后再检查主键索引的树两次,效率很低。

1.4、重做日志(重做日志):

事务提交后,Innodb会先将数据从磁盘读取到内存中进行修改,然后将事务日志写入日志缓冲区,再刷新到重做日志文件中进行持久化。

然后定期刷新到磁盘。

例如,用于故障恢复,以继续那些已提交但数据尚未完全写回磁盘的事务。

1.5、双写(两次写):

为了防止重做日志在写入过程中被损坏,我们需要保留一个备份。如果出现故障,请在数据恢复之前从备份中恢复重做日志。

1.6、撤销日志:

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

撤消操作:当Innodb存储引擎回滚时,它实际上执行与前一个引擎相关的工作。对于插入操作,Innodb将完成删除,而对于更新,它将执行相反的更新,这将修改

把前排放回去。

1.7.自适应哈希索引:

Innodb会监控索引在表上的搜索频率,如果发现建立哈希索引会提高速度,会自动创建哈希索引。有些页面不是对整个表进行索引,而是根据访问频率进行索引。

1.8.交易提交:

在事务处理过程中,每次执行sql语句时,都会记录撤销日志和重做日志,然后更新数据形成脏页。然后根据时间或空间等条件丢弃重做日志,根据检查点丢弃撤销日志和脏页。

删除磁盘,然后可以删除相应的重做日志。此时,交易尚未提交。如果崩溃,首先检查检查点记录,使用相应的重做日志来恢复数据和撤消日志,然后

检查撤消日志的状态,发现事务尚未提交,然后使用撤消日志回滚。当事务提交时,与此事务相关的所有重做日志都将被删除,只有所有重做日志将被成功删除。

提交成功。然后根据检查点继续丢弃内存中的脏页数据。如果此时发生崩溃,则仅使用重做日志来恢复数据。

00-1010n块=innodb _ buffer _ pool有多个页面(块)=innodb _ buffer _ pool _ size/16384(16k)

OS _ THREES=if(innodb _ buffer _ pool _ size=1000 Mb)=50000

else if(innodb _ buffer _ pool _ size=8Mb)=10000

Else=1000(此值仅在* nixes系统上使用,OS_THREADS的计算与Windows略有不同)

1、INNODB内存结构

>innodb_buffer_pool_sizeinnodb_additional_mem_pool_sizeinnodb_log_buffer_sizeadaptive index hash ,size (innodb buffer 索引管理区)= innodb_buffer_pool_size/64system dictionary hash,size(innodb内部字典区) = 6 * innodb_buffer_pool_size/512memory for sync_array,size(用于Innodb内部syncronzation的开销)=OS_THREAD * 512memory for os_event,size(用于innodb内存的syncronzation的开销)=OS_THREAD * 216memory 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最根本最需要多少内存,这样对于服务器的内存使用也可以有一个规划了。


觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。