当前位置:Gxlcms > mysql > 辛星浅谈mysql中的数据碎片以及引擎为MyISAM下的操作_MySQL

辛星浅谈mysql中的数据碎片以及引擎为MyISAM下的操作_MySQL

时间:2021-07-01 10:21:17 帮助过:37人阅读

对于mysql中的数据碎片,其实和我们删除数据是息息相关的,删除数据的时候必然会在数据文件中造成不连续的空白空间,对于少量的数据的删除,并不会产生多少的空白空间。如果在一段时间内的大量的删除操作,会使得这种留空的空间变得比存储列表内容所使用的空间更大。可能有人会说,我们向数据库中插入数据的时候,会不会在这些空白空间中插入数据呢?答案是会的。但是,它会造成一个后果,那就是数据的存储位置不连续,以及物理存储顺序与理论上的存储顺序不相同,这就比较麻烦了。

按照数据碎片的大小来分,可以分为单行数据碎片和多行数据碎片。其实不仅仅会产生数据碎片,如果加了索引,还会产生索引碎片,这样会造成顺序的紊乱。由于MySQL的引擎的内部实现机制不同,在数据碎片的处理上也会不同。

对于MyISAM来说,因为它的索引和数据以及表结构分为三个文件来存储,因此optimize可以整理数据文件,并且重新排序,这样因为数据碎片产生的性能问题会减少很多,直接使用【optimize table 表名】即可,但是此时也应该注意一些问题,由于该操作会锁住表,所以我们尽量定期整理一下碎片,在访问量小的时候来做这件事。我们可以查看information_schema数据库下的tables中的free_data字段即可,如果该字段不为0,则产生了数据碎片,看下面操作:

  1. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  2. mysql> use information_schema;
  3. Database changed
  4. mysql> select data_free from tables;
  5. +-----------+
  6. | data_free |
  7. +-----------+
  8. | 0 |
  9. | 0 |
  10. ...中间省略部分数据
  11. | 0 |
  12. | 72 |
  13. | 0 |
  14. | 0 |
  15. +-----------+
  16. 162 rows in set (0.06 sec)
  17. mysql>

这里我们是查看所有的表中的数据碎片,如果我们想单独看某一个表的数据碎片,看下面操作:

第一步,我们先建立一个库和一个表,并向其中插入四条数据:

  1. mysql> create database xinxing;
  2. Query OK, 1 row affected (0.16 sec)
  3. mysql> use xinxing;
  4. Database changed
  5. mysql>
  6. mysql> create table xin (c char(40)) engine = myisam;
  7. Query OK, 0 rows affected (0.06 sec)
  8. mysql>
  9. mysql> insert into xin values('xiaohei'),('xiaoqian'),
  10. -> ('xiaolin'),('xiaonan');
  11. Query OK, 4 rows affected (0.03 sec)
  12. Records: 4 Duplicates: 0 Warnings: 0

第二步,我们查看这个表的信息:

  1. mysql> show table status from xinxing \G
  2. *************************** 1. row ***************************
  3. Name: xin
  4. Engine: MyISAM
  5. Version: 10
  6. Row_format: Fixed
  7. Rows: 4
  8. Avg_row_length: 121
  9. Data_length: 484
  10. Max_data_length: 34058472181989375
  11. Index_length: 1024
  12. Data_free: 0
  13. Auto_increment: NULL
  14. Create_time: 2014-08-25 13:19:02
  15. Update_time: 2014-08-25 13:19:35
  16. Check_time: NULL
  17. Collation: utf8_general_ci
  18. Checksum: NULL
  19. Create_options:
  20. Comment:
  21. 1 row in set (0.00 sec)

我们发现这里面并没有数据碎片,都是非常严密的。

第三步,我们删除一条数据:

  1. mysql> delete from xin where c = 'xiaolin';
  2. Query OK, 1 row affected (0.00 sec)

第四步,我们再次查看,发现数据碎片产生了:

  1. mysql> show table status from xinxing \G
  2. *************************** 1. row ***************************
  3. Name: xin
  4. Engine: MyISAM
  5. Version: 10
  6. Row_format: Fixed
  7. Rows: 3
  8. Avg_row_length: 121
  9. Data_length: 484
  10. Max_data_length: 34058472181989375
  11. Index_length: 1024
  12. Data_free: 121
  13. Auto_increment: NULL
  14. Create_time: 2014-08-25 13:19:02
  15. Update_time: 2014-08-25 13:20:15
  16. Check_time: NULL
  17. Collation: utf8_general_ci
  18. Checksum: NULL
  19. Create_options:
  20. Comment:
  21. 1 row in set (0.00 sec)

我们发现上面的data_free字段为121,也就是产生了121字节的空白空间。

大家注意,我们这里只是删除了一条数据,如果删除n条数据,那这些碎片就很影响性能了,至于它的解决办法,我们上面也提到了,这里就不再提了。我是辛星,期待您的关注。

人气教程排行