【编程|程序员应知应会之MySQL数据库的碎片整理】
文章图片
大家都知道Windows磁盘工具里有一个磁盘碎片整理 , 与之类似的是 , MySQL数据库里也会产生碎片 , 也需要整理 。
MySQL碎片就是指数据文件中一些不连续的空白空间 , 因为大小的原因 。 这些空白空间无法被全部利用上 , 久而久之 , 这些空白空间越来越多 , 越来越碎 , 从而就会引起物理存储和逻辑存储的位置顺序不一致的问题 , 导致了碎片的产生 。
一、数据库碎片的产生 。
MySQL在执行delete或者update操作时 , 就有可能产生碎片 。
在执行delete操作的时候 , 存储中会产生由于delete操作而留下的空白空间 , 而当有新数据插入时 , MySQL会尝试使用这些空白空间 , 但是数据又不可能完全一致 , 正好把空白覆盖满 , 于是会就有空白空间出现 。 尤其是在大量delete操作的时候 , 会出现大量的空白空间 。
在执行update的时候 , 例如在可变长度的字段 , 比如说varchar或lob , 更新的数据可能和原来的长度不一样 , 这样也会产生碎片 。 比如说原始长度是varchar(100) , 但我们更新了大量长度为50的数据 , 这样的话 , 就有50的空间成为了空白 。 对于MySQL的innodb存储引擎来说 , 表存储数据的单位是页 , 而update操作会造成页分裂 , 分裂以后存储变得不连续、不规则 , 从而产生碎片 。
二、碎片造成的问题
碎片会造成很多问题例如说空间浪费和读写性能下降 。 由于存在大量碎片 , 数据从连续规则的存储方式变为随机分散的存储方式 , 会增加磁盘IO的负担 , 于是读写性能会下降 。
三、MySQL中如何处理碎片
在MySQL中 , 可以利用
show table status like ‘%table_name%’;
语句来查看表状态 。
其中data_length是表数据大小 , index_length是表索引大小 , data_free就是碎片大小 , 当data_free大于0时 , 意味着表中有碎片 。
optimize table table_name;
语句可以清理碎片 , 但并不是所有的存储引擎都支持(程序员应知应会之MySQL的存储引擎?) , 该语句适用于InnoDB、MyISAM 和 ARCHIVE 表 。
此操作会锁表 , 时间长短依据表数据量的大小 。
另外我们也可以通过重建表的存储引擎来重组数据和索引的存储 , 从而达到清理碎片的目的 。
语句如下:
alter table table_name engine = innodb;
- 程序员|程序员的口味变了!C++首次逆袭JAVA:跻身最受欢迎编程语言TOP3
- 【框架】123:spring框架之面向切面编程
- 【框架】124:spring框架之切面编程步骤说明
- 编程|事件回顾:强子走后,京东也基本废了
- 小米13|数影周报:程序员离职后锁公司硬盘;“交个朋友”成立淘宝事业部
- 编程|台积电赴美设厂,投资400亿美元,将面临三大挑战,美梦恐成噩梦
- 靠玩ChatGPT|0行代码拿210万年薪程序员新工作纯靠和ai聊天
- 程序员|0行代码拿210万年薪 程序员新工作纯靠和AI聊天
- 编程|849元,入手8+128GB版的OPPOA36,那是真香!
- 软件|欧美国家要是禁止我们使用各种编程语言该怎么办?
