返回顶部
首页 > 资讯 > 数据库 >MySQL的碎片有哪些
  • 149
分享到

MySQL的碎片有哪些

2024-04-02 19:04:59 149人浏览 薄情痞子
摘要

本篇内容主要讲解“Mysql的碎片有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql的碎片有哪些”吧!Mysql 的几种碎片整理方案总结(解决del

本篇内容主要讲解“Mysql的碎片有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习mysql的碎片有哪些”吧!

MySQL的碎片有哪些

Mysql 的几种碎片整理方案总结(解决delete大量数据后空间不释放的问题)

1.背景知识?

1.1 为什么会有碎片?

  1. MySQL 中 insert 与 update 都可能导致页分裂,这样就存在碎片。

    对于大量的UPDATE,也会产生文件碎片化 , Innodb的最小物理存储分配单位是页(page),而UPDATE也可能导致页分裂(page split),频繁的页分裂,页会变得稀疏,并且被不规则的填充,所以最终数据会有碎片。

  2. delete 语句实际上只是给数据打个标记,并且记录到一个链表中,这样就形成了留白空间。

    在InnoDB中,删除一些行,这些行只是被标记为“已删除”,而不是真的从索引中物理删除了,因而空间也没有真的被释放回收。InnoDB的Purge线程会异步的来清理这些没用的索引键和行。

  3. 当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片;

  4. 总结:

    • truncate table其实有点类似于drop table 然后creat,只不过这个create table 的过程做了优化,比如表结构文件之前已经有了等等。所以速度上应该是接近drop table的速度;

    1. drop ,truncate 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ;

    2. delete from table_name删除表的全部数据,对于MyISAM 会立刻释放磁盘空间 (应该是做了特别处理,也比较合理),InnoDB 不会释放磁盘空间;

    3. 对于 delete from table_name where xxx; 带条件的删除, 不管是innodb还是MyISAM都不会释放磁盘空间;

    4. delete操作以后使用optimize table table_name 会立刻释放磁盘空间。不管是innodb还是myisam 。所以要想达到释放磁盘空间的目的,delete以后执行optimize table 操作。

    5. delete from表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分空间。

    6. 表的增删改操作,可能会造成数据空洞的,当对表进行大量的增删改操作后,数据空洞存在的可能性比较大。

    7. MySQL删除数据几种情况以及是否释放磁盘空间:

1.2 碎片带来的问题

  • 当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分;

  • MySQL数据库中的表在进行了多次delete、update和insert后,表空间会出现碎片。定期进行表空间整理,消除碎片可以提高访问表空间的性能。

  • 这种碎片不仅额外增加了存储代价,同时也因为数据碎片化降低了表的扫描效率。

  • 碎片若不整理,那么可能会长期占据磁盘空间,导致磁盘使用率越来越高。

2. 如何清理碎片?

修复问题的前提是要先找到问题,这样才能对症下药。

2.1. 查看表的碎片情况

  1. 查看数据库中每个存在碎片的表

    mysql> select concat('optimize table ',table_schema,'.',table_name,';'),data_free,engine from infORMation_schema.tables where data_free>0 and engine !='MEMORY';
    +-----------------------------------------------------------+-----------+--------+
    | concat('optimize table ',table_schema,'.',table_name,';') | DATA_FREE | ENGINE |
    +-----------------------------------------------------------+-----------+--------+
    | optimize table abc.t_user_answer;                    		|   2097152 | InnoDB |
    | optimize table mysql.time_zone_transition;                |   4194304 | InnoDB |
    | optimize table mysql.time_zone_transition_type;           |   4194304 | InnoDB |
    | optimize table mysql.user;                                |   4194304 | InnoDB |
    。。。。
  2. 查看指定表的碎片情况

     mysql> show table status like 't_user'\G
     *************************** 1. row ***************************
                Name: t_user
              Engine: InnoDB
             Version: 10
          Row_format: Dynamic
                Rows: 4333
      Avg_row_length: 589
         Data_length: 2555904
     Max_data_length: 0
        Index_length: 2719744
           Data_free: 4194304
      Auto_increment: NULL
         Create_time: 2021-11-19 10:13:31
         Update_time: 2022-04-20 14:28:42
          Check_time: NULL
           Collation: utf8mb4_general_ci
            Checksum: NULL
      Create_options:
             Comment:
     1 row in set (0.00 sec)

    Data_free: 4194304 就代表碎片的byte数。如果经常删改数据表,会造成大量的Data_free 频繁 删除记录 或修改有可变长度字段的表。

  3. 找到碎片化最严重的表

    SELECT table_schema, TABLE_NAME, concat(data_free/1024/1024, 'M') as data_free
    FROM `information_schema`.tables
    WHERE data_free > 3 * 1024 * 1024
    	AND ENGINE = 'innodb'
    ORDER BY data_free DESC

2.2 清理碎片(回收空间)的方法

官方文档参考
MySQL的碎片有哪些

通常有这几种做法
  1. alter table tb_test engine=innodb; (本质上是 recreate)

  2. optimize table tb_test; (本质上是 recreate,但是在不同创建下会有区别)

  3. ALTER TABLE tablename FORCE (在InnoDB表中等价于 alter table tb_test engine=innodb; )

  4. mysqlcheck 批量表空间优化

  5. gh-ost/pt-osc

  6. pt-online-schema-change (本质上也是 先备份旧表数据,然后 truncate 旧表)

1. alter table tb_test engine=innodb 原理介绍

这其实是一个NULL操作,表面上看什么也不做,实际上重新整理碎片了.当执行优化操作时,实际执行的是一个空的 ALTER 命令,但是这个命令也会起到优化的作用,它会重建整个表,删掉未使用的空白空间.

Running ALTER TABLE tbl_name ENGINE=INNODB on an existing InnoDB table performs a “null” ALTER TABLE operation, which can be used to defragment an InnoDB table, as described in Section 15.11.4, “Defragmenting a Table”. Running ALTER TABLE tbl_name FORCE on an InnoDB table performs the same function.

    MySQL5.6 开始采用 Inplace 方式重建表,Alter 期间,支持 DML 查询和更新操作,语句为 alter table t engine=innodb, ALGoRITHM=inplace;之所以支持 DML 更新操作,是因为数据拷贝期间会将 DML 更新操作记录到 Row log 中。

    重建过程中最耗时的就是拷贝数据的过程,这个过程中支持 DML 查询和更新操作,对于整个 DDL 来说,时间很短,就可以近似认为是 Online DDL。

    执行过程:

    1、获取 MDL(Meta Data Lock)写锁,innodb 内部创建与原表结构相同的临时文件

    2、拷贝数据之前,MDL 写锁退化成 MDL 读锁,支持 DML 更新操作

    3、根据主键递增顺序,将一行一行的数据读出并写入到临时文件,直至全部写入完成。并且,会将拷贝期间的 DML 更新操作记录到 Row log 中

    4、上锁,再将 Row log 中的数据应用到临时文件

    5、互换原表和临时表表名

    6、删除临时表
2. optimize table xxx;

OPTIMIZE TABLE语句可以重新组织表、索引的物理存储,减少存储空间,提高访问的I/O效率。类似于碎片整理功能。

MySQL可以通过optimize table语句释放表空间,重组表数据和索引的物理页,减少表所占空间和优化读写性能

  1. 使用语法

    OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_n说ame [, tbl_name] …

    • 对于主从架构, LOCAL 参数可以让这个过程不写入 binlog ,这样在主库上执行时就不会同步给从库了

    • 默认情况下,MySQL将OPTIMIZE TABLE语句写入二进制日志,以便它们复制到slave服务器。如果不想写二进制日志,使用命令时加上NO_WRITE_To_BINLOG或LOCAL关键字即可。

    • 使用这个语句需要具有对目标表的SELECT、INSERT权限。

  2. 注意:

    1. 需要有足够的空间才能进行OPTIMIZE TABLE。 (剩余空间必须 > 被 OPTIMIZE 的表的大小)

    2. OPTIMIZE 只对独立表空间(innodb_file_per_table=1)才有用,对共享表空间不起作用。

      对于共享表空间,如果需要瘦身: 必须将数据导出,删除ibdata1,然后将 innodb_file_per_table 设置为独立表空间, 然后将数据导入进来。

    3. 对于InnoDB的表,OPTIMIZE TABLE 的工作原理如下

      对于InnoDB表, OPTIMIZE TABLE映射到ALTER TABLE … FORCE(或者这样翻译:在InnoDB表中等价 ALTER TABLE … FORCE),它重建表以更新索引统计信息并释放聚簇索引中未使用的空间。

      当您在InnoDB表上运行时,它会显示在OPTIMIZE TABLE的输出中,如下所示:
      mysql> OPTIMIZE TABLE foo; 
      +----------+----------+----------+---------------------------------------+ 
      | Table    | Op       | Msg_type | Msg_text                                                          | 
      +----------+----------+----------+---------------------------------------+ 
      | test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead | 
      | test.foo | optimize | status   | OK                                                                | 
      +----------+----------+----------+---------------------------------------+ 
      
      # 但这个提示语可以忽略,从严格的意义讲,说InnoDB不支持optimize table,其实不太准确。 因为 MYSQL的文档说明了,当INNODB 的表,MYSQL会以 ALTER TABLE force  +  analyze 去执行这个命令(相当于做了recreate和analyze)。 所以最终还是会看到 OK 的状态。 
      # https://stackoverflow.com/questions/30635603/what-does-table-does-not-support-optimize-doing-recreate-analyze-instead-me
    4. 对于MYISAM表,OPTIMIZE TABLE 的工作原理:
      1. 如果表已删除或分隔行,就修复该表。
      2. 如果索引页没有排序,就排序它们。
      3. 如果表的统计信息不是最新的(而且修复不能通过对索引进行排序),就更新它们。

    5. **执行时也可以发现报错: Temporary file write failure. **

      建议参考这片文章:
      Mysql optimize table 时报错 Temporary file write failure. 的解决方案

  3. optimize 语句的官网介绍

    • 如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用 OPTIMIZE TABLE。

    • 被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。

    • 在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次 即可,只对特定的表运行。

  4. Mysql 5.6 之前 在OPTIMIZE TABLE运行过程中,MySQL会锁定表,5.6之后有了 Online DDL 则大大减少了锁表时间。

3. alter table、analyze table和optimize table区别
  • alter table tb_test engine = innodb;

    • (也就是 recreate)MySQL 5.5以前用Offline的方式重建表,5.6以后用Online的方式重建表;

  • analyze table tb_test ;

    • 重新统计表的索引信息,不会修改数据,不会重建表,整个过程加MDL读

  • optimize table tb_test ;

    • 是 alter table xxx = innodb; + analyze table xxx; 的过程。

4. OPTIMIZE TABLE 和ALTER TABLE xxxx ENGINE= INNODB哪个更好
  • OPTIMIZE TABLE 还是ALTER TABLE xxxx ENGINE= INNODB 基本上是一样的。但是在有些情况下,ALTER TABLE xxxx ENGINE= INNODB更好。

    • 例如: old_alter_table 系统变量没有启用等等。

  • 另外: 对于MyISAM类型表,使用ALTER TABLE xxxx ENGINE= INNODB 是明显要优于 OPTIMIZE TABLE这种方法的。

2.3 官方建议

MySQL官方建议不要经常(每小时或每天)进行碎片整理,一般根据实际情况,只需要每周或者每月整理一次即可(我们现在是每月凌晨4点清理mysql所有实例下的表碎片)

到此,相信大家对“MySQL的碎片有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL的碎片有哪些

本文链接: https://lsjlt.com/news/73941.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL的碎片有哪些
    本篇内容主要讲解“MySQL的碎片有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL的碎片有哪些”吧!MySQL 的几种碎片整理方案总结(解决del...
    99+
    2024-04-02
  • Docker管理的碎片知识有哪些
    本篇内容主要讲解“Docker管理的碎片知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker管理的碎片知识有哪些”吧!一、概述本文旨在汇总整理Docker日常管理的知识碎片。二、...
    99+
    2023-06-21
  • 回收mysql表的碎片
    由于操作人员大量的删除了relationship表的数据达2千万行,但是mysql并不自动回收空间,所以决定做碎片整理(先测试):myisamchk -r relationship我是在mysql运行下做的...
    99+
    2024-04-02
  • mysql 表碎片整理
    查看数据库中表、索引和碎片大小的大小:select round(sum(data_length/1024/1024),2) as data_length_MB,  round(sum(i...
    99+
    2024-04-02
  • phpcms碎片有什么用
    phpcms碎片有灵活的网页布局、可重用的模块、动态内容管理和多人协作开发的作用。1、灵活的网页布局,通过将网页内容拆分成若干个碎片,可以根据需要自由地安排这些碎片的位置和顺序;2、可重用的模块,当需要修改页头或页脚时,只需修改碎片一次即可...
    99+
    2023-08-08
  • MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)
    网络上有很多MySQL表碎片整理的问题,大多数是通过demo一个表然后参考data free来进行碎片整理,这种方式对myisam引擎或者其他引擎可能有效(本人没有做详细的测试).对Innodb引擎是不是准确的,或者data fr...
    99+
    2021-08-24
    MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)
  • mysql表碎片的查询自己回收
    在MySQL中,我们经常会使用VARCHAR、TEXT、BLOB等可变长度的文本数据类型。不过,当我们使用这些数据类型之后,我们就不得不做一些额外的工作——MySQL数据表碎片整理。 每当MySQL从你的列...
    99+
    2024-04-02
  • MySQL数据碎片的整理和分析
    MySQL数据碎片的整理和分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 MySQL具有相当多不同种类的...
    99+
    2024-04-02
  • mysql图片的数据类型有哪些
    在MySQL中,图片可以使用以下几种数据类型存储:1. BLOB:Binary Large Object,用于存储二进制数据。BLO...
    99+
    2023-09-21
    mysql
  • Linux上没有磁盘碎片清理功能怎么整理磁盘碎片
    这篇文章主要介绍“Linux上没有磁盘碎片清理功能怎么整理磁盘碎片”,在日常操作中,相信很多人在Linux上没有磁盘碎片清理功能怎么整理磁盘碎片问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux上没有磁...
    99+
    2023-06-13
  • MySQL - 表空间碎片整理方法
    MySQL数据库中的表在进行了多次delete、update和insert后,表空间会出现碎片。定期进行表空间整理,消除碎片可以提高访问表空间的性能。 检查表空间碎片 下面这个实验用于验证进行表空间整理后对性能的影响,首先检查这个...
    99+
    2023-10-25
    mysql adb android
  • mysql怎么查看表碎片大小
    这篇文章主要为大家展示了“mysql怎么查看表碎片大小”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql怎么查看表碎片大小”这篇文章吧。查看表碎片大小(1)查看某个表的碎片大小mysql&...
    99+
    2023-06-01
  • MySQL表空间碎片的概念是什么
    这篇文章主要介绍MySQL表空间碎片的概念是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!背景经常使用 MySQL 的话,会发现 MySQL 数据文件的磁盘空间一般会不停的增长,而且有时候删了数据或者插入一批数据...
    99+
    2023-06-14
  • mysql数据碎片太多如何解决
    这篇文章主要介绍了mysql数据碎片太多如何解决,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。mysql数据碎片太多的解决方法:1、进入phpM...
    99+
    2024-04-02
  • Mysql中怎么查看索引页碎片
    这篇文章给大家介绍Mysql中怎么查看索引页碎片,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。查询索引页碎片:SHOW TABLE STATUS LIKE '表名'; ...
    99+
    2024-04-02
  • MySQL磁盘碎片整理实例演示
    目录1.磁盘碎片是什么2.实验3.对于碎片回收操作4.后记补充:如何优化磁盘空间数据库引擎以InnoDB为主 1.磁盘碎片是什么 ​InnoDB表的数据存储在页中,每个页可以存放多条...
    99+
    2024-04-02
  • mysql如何进行OPTIMIZE TABLE整理碎片
    这篇文章给大家介绍mysql如何进行OPTIMIZE TABLE整理碎片,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。来看看手册中关于 OPTIMIZE 的描述:OPTIMIZE [LOCAL | NO_WRITE_T...
    99+
    2023-06-06
  • 碎片较多的表重组
    首先查询出数据库中需要重组的表: SELECT d.name,d.dbid,p.*,p.curr_mb-p.net_mb as save_mb,round((p.CURR_MB-p.NET_MB)/...
    99+
    2024-04-02
  • windows碎片整理对硬盘有没有伤害
    本篇内容介绍了“windows碎片整理对硬盘有没有伤害”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2023-02-22
    windows
  • MySQL表的碎片整理和空间回收的方法
    目录MySQL表碎片化(Table Fragmentation)的原因行碎片(Row fragmentation)行间碎片(Intra-row fragmentaion)剩余空间碎片...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作