zoukankan      html  css  js  c++  java
  • Mysql 表空间和 数据页空洞

    一、表空间
    1、表空间: innodb 引擎存储的最高层; 存放所有的数据
    2、独立表空间:Mysql 版本 5.6 后默认开启的单表单空间
    (1)Innodb 默认存储引擎页的大小为 16K ;默认表空间 大小为96k

    (2)独立表空间 开启方式 innodb_file_per_table ON 从Mysql 5.6.6 开始,默认值 ON

    二、数据页空洞

    如果我们修改了 info表 的表结构 ,比如 给表添加注释,发现
    
    9440 Dec 14 09:59 info.frm
    
    磁盘上的 frm 表结构文件 立刻被更新了。
    
    那我们如果删除一行数据呢? 从文件更改时间上来看也是立刻修改了。
    
    180224 Dec 14 10:03 temp.ibd
    
    但是 idb数据文件 大小 180224却没有改变
    
    那么数据库的删除流程到底是怎么样的? 为什么我们删除一行,存储的ibd文件大小却没有改变,当我们点击 删除表的时候,SQl 引擎发生了什么?

    1、Innodb 的删除
      为什么 ibd 文件不会变小?

    • InnoDb 的数据存储类型是 B+树 ,B+树的叶子结点上 ,存储的是 数据页 ; 一页数据页存储的是 数据记录,假设一条数据记录占用 200字节 ,一页数据页大小为 16Kb ,那么一页可以存储80条数据记录 ,当某条数据记录,比如 ID = 300 的数据记录被删除了,实际上,引擎只会标记这条数据记录为删除,而不会将数据记录从磁盘上抹去,所以磁盘文件上的 ibd 文件不会缩小
    • 一个数据页 Page A 上,总是存储着 ID从 X 到 X+N 的 数据记录, 如果 X 到 X+N 之间的数据记录被删除了,会留下一个数据空洞,那么插入的X 到 X+N 区间之间,且不在PageA上,就会复用这个数据页, 所以文件大小不会减少
    • 如果删除了1整个数据页的所有记录,那么这整个数据页都会被复用,
    • 所以删除和插入,其实是在数据页上,产生和填补空洞 的过程 ,经过删除更新插入的表,都可能会产生大量的空洞。

    2、整理数据页的空洞
      那么,当一张表被更新插入,产生了数据空洞之后,如何整理数据页,使得数据变得更紧凑呢?

      可以采取重建表的操作 alter table,实际上这里是 引擎自动完成了 转存数据、交换表名、删除旧表的操作 

      mysql> alter table temp engine=innodb;
    
      163840 Dec 14 10:52 temp.ibd

    3、测试数据页的增长效果
      新建一张 new_test 表

    CREATE TABLE `new_test` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` char(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=191 DEFAULT CHARSET=utf8mb4;

      我们知道 初始 ibd文件 的大小默认是 96K ,inndb 默认单个数据页大小是16K,对 new_test 表进行数据增加,观察 ibd文件大小。

      insert into new_test (name) value("leon”)

      发现 当rows 增长时,ibd文件大小增长规律如下:

      idb文件大小 VS rows
        96k – 0~81
        128k – 82~136
        144k – 136~190
        160k – 190~255

      16K 增长对应 54条rows ,1条row算出来约等于 296.29b , 正好等于 char 255b + int(11) 44 = 299b 。

      可以看出来的确是由连续的数据页组成数据的。

    4、数据空洞的复用
      为了数据空洞的复用的问题,我们来删除 new_test 表 1-180行中的 155-160 行 ,ibd文件 原始大小为 144KB,当我们删除 150-160 这时候,数据页就有了 10条ID 的空洞 ,此时表中ID是 : 0-149 161 -180 共计 170条, 那么这时候,插入20条 还是 10条 数据页呢 ?

      测试可得。插入20条,ID到 201。表空间变为 160k,所以原来的数据页存在空洞 可以被复用(??待理解!!)

    ---按照计算应该一条数据是800b,有十条空洞,再加入10条,应该是144KB+0.8*10=152KB,160k不是说明原来的空洞没有复用上吗??

    原文:https://blog.csdn.net/qq_28018283/article/details/85003657

  • 相关阅读:
    解决 搭建Jekins过程中 启动Tomcat的java.net.UnknownHostException异常
    射手和农场主
    java 和 JS(javaScript)中的反斜杠正则转义
    分享修改密码的SharePoint Web part: ITaCS Change Password web part
    分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机
    Office 365 的公共网站的一些限制及解决的办法
    SharePoint 2013 关闭 customErrors
    安装 KB2844286 导致SharePoint 2010 XSLT web part 显示出现错误
    安装Office Web Apps Server 2013 – KB2592525安装失败
    如何将hyper-v虚拟机转换成vmware的虚拟机- 转换SharePoint 2010 Information Worker Demonstration and Evaluation Virtual Machine (SP1)
  • 原文地址:https://www.cnblogs.com/ivy-zheng/p/11109972.html
Copyright © 2011-2022 走看看