当我执行 SHOW TABLE STATUS databaseName;
我在所有表中获得值为 17825792 的 Data_free 信息:
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
| ubqACL | InnoDB | 10 | Compact | 0 | 0 | 16384 | 0 | 16384 | 17825792 | 1 | 2011-08-23 17:45:48 | NULL | NULL | utf8_general_ci | NULL | | Access Control List per a ubqDocs |
| ubqAssociacions | InnoDB | 10 | Compact | 1216 | 148 | 180224 | 0 | 262144 | 17825792 | 1246 | 2011-08-23 17:45:48 | NULL | NULL | utf8_general_ci | NULL | | Vincles entre documents |
Run Code Online (Sandbox Code Playgroud)
数据库引擎是 InnoDB。
我想检索此值以计算碎片并触发优化操作。
Data_free 总是在每个表上返回相同的数字的原因很简单:
只要这两个条件存在,就永远不会消除碎片。任何针对 InnoDB 表运行 OPTIMIZE TABLE 的尝试都会使表的数据和索引连续,但会附加到 ibdata1,使 ibdata1 变得更大。
有鉴于此,您必须知道 ibdata1 中的内容。里面有四(4)种类型的信息:
你必须做四(4)件主要的事情:
这会将所有数据和索引保留在 ibdata1 之外,并将它们存储在单独的 .ibd 文件中。从那里,您可以针对配置为 innodb_file_per_table 的 InnoDB 表运行 OPTIMIZE TABLE。因此,.ibd 文件可以单独进行碎片整理。
这将使 ibdata1 尽可能小,永远不会再次失控。InnoDB 碎片整理的所有担忧都只是一个优化表。
-- 应该注意的是,INNODB 表上的 OPTIMIZE TABLE 操作与使用其他存储引擎略有不同。Percona 有一篇关于提高 OPTIMIZE TABLE 速度以及何时应该/不应该考虑在此处执行所述操作的好文章。
“对于 InnoDB 表,OPTIMIZE TABLE 映射到 ALTER TABLE,它重建表以更新索引统计信息并释放聚集索引中未使用的空间。”
归档时间: |
|
查看次数: |
3482 次 |
最近记录: |