解析mysql 表中的碎片产生原因以及清理
2013-06-22 00:00
375 查看
大量删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来 。
对于不同的存储引擎整理碎片的方式不一样。
myisam
可以有以下方式:
mysql> show table status from test like 'testusers'\G
*************************** 1. row ***************************
....
Rows: 3
Avg_row_length: 45
Data_free: 40
.....
因为在中间删除,所以留下了空白
mysql> optimize table testusers;
+----------------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------+----------+----------+----------+
| test.testusers | optimize | status | OK |
+----------------+----------+----------+----------+
1 row in set (0.00 sec)
mysql> show table status from test like 'testusers'\G
*************************** 1. row ***************************
...
Rows: 3
Avg_row_length: 32
Data_length: 96
Data_free: 0
1 row in set (0.00 sec)
在optimize后,Data_free已经变为0.碎片数据被清除。
同样还可以用以下方式,效果和optimize一样
./bin/mysqlcheck -uroot -proot --socket=./tmp/mysql.sock -o test testusers
innodb
对于innodb 使用optimize和mysqlcheck都不起作用,可以如下进行
对于小表的话直接用ALTER TABLE table_name ;回收表空间,对于大表就不能直接采用这种方式,因为会造成长时间的锁表。可以采用新建表转移数据,然后删除旧表的形式,然后再重命名表。
另外有个python可以查看innodb表空间信息,可以在网上找哈,用python写的。
对于不同的存储引擎整理碎片的方式不一样。
myisam
可以有以下方式:
mysql> show table status from test like 'testusers'\G
*************************** 1. row ***************************
....
Rows: 3
Avg_row_length: 45
Data_free: 40
.....
因为在中间删除,所以留下了空白
mysql> optimize table testusers;
+----------------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------+----------+----------+----------+
| test.testusers | optimize | status | OK |
+----------------+----------+----------+----------+
1 row in set (0.00 sec)
mysql> show table status from test like 'testusers'\G
*************************** 1. row ***************************
...
Rows: 3
Avg_row_length: 32
Data_length: 96
Data_free: 0
1 row in set (0.00 sec)
在optimize后,Data_free已经变为0.碎片数据被清除。
同样还可以用以下方式,效果和optimize一样
./bin/mysqlcheck -uroot -proot --socket=./tmp/mysql.sock -o test testusers
innodb
对于innodb 使用optimize和mysqlcheck都不起作用,可以如下进行
对于小表的话直接用ALTER TABLE table_name ;回收表空间,对于大表就不能直接采用这种方式,因为会造成长时间的锁表。可以采用新建表转移数据,然后删除旧表的形式,然后再重命名表。
另外有个python可以查看innodb表空间信息,可以在网上找哈,用python写的。
相关文章推荐
- 解析mysql 表中的碎片产生原因以及清理
- mysql 表中的碎片的产生原因以及清理
- MySQL优化——定期清理索引碎片
- CentOS下httpd下php 连接mysql 本机可以,外网报错Could not connect: Can't connect to MySQL server on '127.0.0.1' (13)2003 原因解析
- Java基础知识强化之集合框架笔记19:List集合迭代器使用之 并发修改异常的产生原因 以及 解决方案
- 电子邮件为什么要编码以及产生乱码的原因?
- linux僵尸进程产生的原因以及如何避免产生僵尸进程
- maven环境变量配置以及失败原因解析
- 清理mysql碎片
- Spring+hibernate+mysql事物不回滚的原因以及处理
- MySQL主从延迟原因以及解决方案
- MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法
- 小结下MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方(转)
- mysql 建议索引的原因以及优缺点
- SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
- PHPWIND 9 mysql大容量数据库碎片清理方法
- 进销存管理中负库存产生的原因以及对应措施
- java.lang.OutOfMemoryError:PermGen space 或者Java heap space的产生原因以及解决办法
- 深入解析MySQL的事务隔离及其对性能产生的影响
- MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法