ITPub博客

首页 > 数据库 > MySQL > Innodb表空间wwwyx8002com 15087858732

Innodb表空间wwwyx8002com 15087858732

原创 MySQL 作者:wwwyx8002comwww 时间:2021-01-15 15:22:01 0 删除 编辑

  InnoDB存储包括三类表空间:系统表空间,用户表空间,Undo表空间。


  **系统表空间:**主要存储MySQL内部的数据字典数据,如information_schema下的数据。


  **用户表空间:**当开启innodb_file_per_table=1时,数据表从系统表空间独立出来存储在以table_name.ibd命令的数据文件中,结构信息存储在table_name.frm文件中。


  **Undo表空间:**存储Undo信息,如快照一致读和flashback都是利用undo信息。


  从MySQL 8.0开始允许用户自定义表空间,具体语法如下:


  这样的好处是可以做到数据的冷热分离,分别用HDD和SSD来存储,既能实现数据的高效访问,又能节约成本,比如可以添加两块500G硬盘,经过创建卷组vg,划分逻辑卷lv,创建数据目录并mount相应的lv,假设划分的两个目录分别是/hot_data和/cold_data。


  这样就可以将核心的业务表如用户表,订单表存储在高性能SSD盘上,一些日志,流水表存储在普通的HDD上,主要的操作步骤如下:


  Inndob存储分布


  创建空表查看空间变化


  设置参数innodb_file_per_table=1时,创建表时会自动创建一个segment,同时分配一个extent,包含32个data page的来存储数据,这样创建的空表默认大小就是96KB,extent使用完之后会申请64个连接页,这样对于一些小表,或者undo segment,可以在开始时申请较少的空间,节省磁盘容量的开销。


  插入数据后的空间变化


  delete数据后的空间变化


  MySQL内部不会真正删除空间,而且做标记删除,即将delflag:N修改为delflag:Y,commit之后会会被purge进入删除链表,如果下一次insert更大的记录,delete之后的空间不会被重用,如果插入的记录小于等于delete的记录空会被重用,这块内容可以通过知数堂的innblock工具进行分析。


  Innodb中的碎片


  碎片的产生


  我们知道数据存储在文件系统上的,总是不能100%利用分配给它的物理空间,删除数据会在页面上留下一些”空洞”,或者随机写入(聚集索引非线性增加)会导致页分裂,页分裂导致页面的利用空间少于50%,另外对表进行增删改会引起对应的二级索引值的随机的增删改,也会导致索引结构中的数据页面上留下一些"空洞",虽然这些空洞有可能会被重复利用,但终究会导致部分物理空间未被使用,也就是碎片。


  同时,即便是设置了填充因子为100%,Innodb也会主动留下page页面1/16的空间作为预留使用(An innodb_fill_factor setting of 100 leaves 1/16 of the space in clustered index pages free for future index growth)防止update带来的行溢出。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69993316/viewspace-2750320/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论
www.yx8002.com 玉祥集团 15087858732

注册时间:2021-01-15

  • 博文量
    2
  • 访问量
    1175