`
LJ你是唯一LT
  • 浏览: 243401 次
社区版块
存档分类
最新评论

mysql optimize 清理碎片

阅读更多
---定期清理脚本
0 1  * * 4 root /root/qingli_mysql.sh
[root@newmysql5 ~]# cat qingli_mysql.sh
#!/bin/bash
date=`date +"%Y-%m-%d %H:%M:%S"`
echo $date >>/root/qingli.log
tables=$(mysql -u root -p"tina" 2>/dev/null -e "select concat(table_schema,'.',table_name) from information_schema.tables where data_free>0 and engine !='MEMORY';" |grep -v "concat")

for table in $tables
do
  mysql -u root -p"****" 2>/dev/null -e "optimize table $table;" >>/root/qingli.log
done
----


1、清理mysql碎片
查询存在碎片的表和碎片的大小:
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 117demo.scan_url;                          |   5242880 | InnoDB |
| optimize table antiyfeature.basic_csv_file;               |   4194304 | InnoDB |
| optimize table antiyfeature.gen_avl_entry;                |   4194304 | InnoDB |
| optimize table antiyfeature.sample_info;                  |   4194304 | InnoDB |
| optimize table avlyun_googleplay.app_package;             |   7340032 | InnoDB |
| optimize table avlyun_googleplay.app_update;              | 376438784 | InnoDB |
| optimize table enginedn.ads_opc_avl;                      |   4194304 | InnoDB |
| optimize table enginedn.avl_info;                         |   4194304 | InnoDB |
| optimize table enginedn.basic_avl_info;                   |   4194304 | InnoDB |
| optimize table enginedn.basic_csv_file;                   |   4194304 | InnoDB |
| optimize table enginedn.gen_change_record;                |   4194304 | InnoDB |
| optimize table enginedn.opc_avl_info;                     |   4194304 | InnoDB |
| optimize table enginedn.package_channel;                  |   4194304 | InnoDB |
| optimize table enginedn.package_info;                     |   4194304 | InnoDB |
| optimize table enginedn.scdf_avl_info;                    |   4194304 | InnoDB |
| optimize table enginedn.sign_avl_info;                    |   4194304 | InnoDB |
| optimize table mobile_event.program_url;                  |   4194304 | InnoDB |
| optimize table mobile_event.sample;                       |   4194304 | InnoDB |
| optimize table mobile_event.sample_url;                   |   4194304 | InnoDB |
| optimize table mobile_event.virus_url;                    |   4194304 | InnoDB |
| optimize table mysql.innodb_index_stats;                  |   4194304 | InnoDB |
| optimize table sohu.detail_sohu;                          |   7340032 | InnoDB |
+-----------------------------------------------------------+-----------+--------+
23 rows in set (0.13 sec)   --共有39个表有碎片,较小的已经提前清理,剩下的需要在空闲时间清理,预计耗时1h30min,可放在凌晨执行~
清理步骤:
执行命令optimize table  table_name;

注意:OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。在OPTIMIZE TABLE运行过程中,MySQL会锁定表。
即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。

| optimize table antiy_bbs.bbs_common_session;              |      2492 | MEMORY |    --不支持这种格式
mysql> optimize table antiy_bbs.bbs_common_session;
+------------------------------+----------+----------+-----------------------------------------------------------+
| Table                        | Op       | Msg_type | Msg_text                                                  |
+------------------------------+----------+----------+-----------------------------------------------------------+
| antiy_bbs.bbs_common_session | optimize | note     | The storage engine for the table doesn't support optimize |
+------------------------------+----------+----------+-----------------------------------------------------------+
| optimize table sohu.basic_sohu;                           |   3145728 | InnoDB |   --3M耗时2min47s

--出现这种,就表示已经清理了
mysql> optimize table antiy_bbs.bbs_ucenter_newpm;
+-----------------------------+----------+----------+-----------------------------+
| Table                       | Op       | Msg_type | Msg_text                    |
+-----------------------------+----------+----------+-----------------------------+
| antiy_bbs.bbs_ucenter_newpm | optimize | status   | Table is already up to date |
+-----------------------------+----------+----------+-----------------------------+
1 row in set (0.25 sec)


MYSQL的文档说明了,当INNODB时,MYSQL会以ALTER TABLE去执行这个命令。 所以最终还是会看到 OK 的状态。
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                                                                |
+----------+----------+----------+-------------------------------------------------------------------+






////////////////////////////////////
注意:生产上不要随便操作,因为会锁表。

mysql> show index from basic_sohu from sohu;
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| basic_sohu |          0 | PRIMARY  |            1 | id          | A         |        8764 |     NULL | NULL   |      | BTREE      |         |               |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)



mysql中OPTIMIZE TABLE的作用 (2009-04-01 17:44:39)转载▼
标签: 杂谈 分类: 工作
1、先来看看多次删除插入操作后的表索引情况
mysql> SHOW INDEX FROM `tbl_name`;
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| tbl_name | 0 | PRIMARY | 1 | StepID | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | FlowID | 1 | FlowID | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerCount | 1 | WagerCount | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_3 | 1 | WagerID | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_3 | 2 | StepType | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_3 | 3 | ParamResult | A | 1 | 255 | NULL | | BTREE | |
| tbl_name | 1 | StepType_2 | 1 | StepType | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | StepType_2 | 2 | ParamResult | A | 1 | 255 | NULL | | BTREE | |
| tbl_name | 1 | WagerID_2 | 1 | WagerID | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_2 | 2 | StepType | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_2 | 3 | ParamResult | A | 1 | 255 | NULL | | BTREE | |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
11 rows in set (0.01 sec)
2、优化表
mysql> optimize table tbl_name;
+---------------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------------+----------+----------+----------+
| test.tbl_name | optimize | status | OK |
+---------------+----------+----------+----------+
1 row in set (40.60 sec)
3、再来看看优化后的效果
mysql> SHOW INDEX FROM `tbl_name`;
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| tbl_name | 0 | PRIMARY | 1 | StepID | A | 172462 | NULL | NULL | | BTREE | |
| tbl_name | 1 | FlowID | 1 | FlowID | A | 86231 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerCount | 1 | WagerCount | A | 4311 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_3 | 1 | WagerID | A | 86231 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_3 | 2 | StepType | A | 172462 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_3 | 3 | ParamResult | A | 172462 | 255 | NULL | | BTREE | |
| tbl_name | 1 | StepType_2 | 1 | StepType | A | 9 | NULL | NULL | | BTREE | |
| tbl_name | 1 | StepType_2 | 2 | ParamResult | A | 86231 | 255 | NULL | | BTREE | |
| tbl_name | 1 | WagerID_2 | 1 | WagerID | A | 86231 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_2 | 2 | StepType | A | 172462 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_2 | 3 | ParamResult | A | 172462 | 255 | NULL | | BTREE | |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
最后,来看看手册中关于 OPTIMIZE 的描述:
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用
OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新
利用未使用的空间,并整理数据文件的碎片。

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

OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。

注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。
分享到:
评论

相关推荐

    mysql 清碎片

    ### MySQL 清理碎片操作详解 #### 一、MySQL 数据库碎片产生的原因及影响 在MySQL数据库中,随着数据的不断增删改查操作,尤其是大量的删除操作后,数据库表中的存储空间会出现“碎片化”的现象。所谓的“碎片”,...

    MySQL 清除表空间碎片的实例详解

    - 清理碎片操作会锁定表,且随着数据量增加,耗时也会增长,不适合在高并发时段执行。 - 更佳的做法是创建一个脚本,安排在访问量较低的时间执行,例如每周三凌晨。 - 定期检查`information_schema.TABLES`的`DATA_...

    解析mysql 表中的碎片产生原因以及清理

    本文将详细分析MySQL表中碎片产生的原因,并且介绍相应的清理方法。 首先,了解MySQL存储引擎是很重要的。MySQL支持多种存储引擎,常见的有InnoDB和MyISAM。不同存储引擎在处理碎片方面有不同的机制和操作方式。 ...

    探讨Mysql中OPTIMIZE TABLE的作用详解

    `OPTIMIZE TABLE`可以清理这些碎片,从而使得新数据能够直接填充这些空闲空间,避免了因碎片导致的数据分散,进而提高数据读写速度。 2. **重建索引**: 对于使用了可变长度行的表(如包含VARCHAR, BLOB或TEXT列的...

    MySQL 中如何优化表释放表空间

    要清理因删除操作产生的数据碎片,官方推荐使用`OPTIMIZE TABLE`命令。这个命令会重建表,整理数据文件,回收被标记为删除但尚未使用的空间。执行`OPTIMIZE TABLE`后,可以使用`information_schema.tables`视图查询...

    MySQL学习之备份恢复MySQL巡检问题记录

    6. **表维护**:定期进行OPTIMIZE TABLE操作,清理碎片,提升查询速度。 7. **复制健康检查**:对于主从复制环境,检查主从同步状态,防止数据丢失或不一致。 8. **数据一致性校验**:使用 CHECK TABLE 或 INNODB_...

    优化MySQL数据库性能的八大妙手.rar

    定期执行OPTIMIZE TABLE命令整理表碎片,提高磁盘空间利用率。清理不再需要的临时表和日志,以释放资源。定期分析并更新统计信息,帮助MySQL做出更好的查询计划。 七、分区与分表 对于大数据量的表,可以考虑使用...

    mysql官方资料_第三版.rar

    9. **定期维护**:定期进行OPTIMIZE TABLE操作,清理碎片,保持表的良好状态。 深入学习官方文档,你将能掌握MySQL的更多高级特性,如物化视图、触发器、存储过程等,以及如何在特定场景下有效地应用它们。此外,...

    关于MySQL 优化的100个的建议

    5. **定期维护**:定期执行OPTIMIZE TABLE,清理碎片,保持表的最佳状态。 6. **监控与分析**:使用MySQL内置的Performance Schema或第三方工具进行性能监控和分析。 7. **主从复制**:通过读写分离,减轻主库负担,...

    数据库优化

    数据库优化是提升系统性能的关键环节,特别是在MySQL数据库中,表空间碎片的存在可能对查询效率产生负面影响。当数据库经历大量的插入、删除和更新操作后,数据的物理存储会变得不连续,形成空间碎片。这些碎片如果...

    一刻钟MySQL优化.zip

    7. **定期维护**:执行定期的数据库维护任务,如ANALYZE TABLE更新统计信息,OPTIMIZE TABLE整理碎片,以及定期清理无用的数据和日志。 8. **慢查询日志**:开启慢查询日志,记录执行时间过长的查询,以便分析和...

    mysql数据库如何实现亿级数据快速清理

    1. 定期运行`OPTIMIZE TABLE`来整理碎片,回收已删除行占用的空间。 2. 分析并调整索引,删除不再需要的索引,或创建更高效的覆盖索引。 3. 使用分区策略,将大表分为多个逻辑部分,便于管理和清理。 4. 设置合理的...

    云计算基础架构-MySQL服务器运维.pptx

    `:对表进行碎片整理,提高查询速度。 6. `REPAIR TABLE table_name;`:修复损坏的表。 在规划和实施MySQL服务器运维时,我们需要注意节点的规划和基础环境的准备。例如,可以使用虚拟化技术如VMware Workstation来...

    Optimize SQL

    8. **定期维护**:包括定期重建索引、清理无用数据、分析表碎片等,保持数据库的良好状态。 9. **分区与分片**:对于大数据量的表,分区可以将数据分散在多个物理位置,提高查询效率。分片则是将数据分布在多个...

    MySQL性能优化的21个最佳实践.zip

    14. **定期分析与优化表**:使用ANALYZE TABLE和OPTIMIZE TABLE来更新统计信息和碎片整理。 15. **限制临时表大小**:设置tmp_table_size和max_heap_table_size,避免临时表溢出到磁盘。 16. **监控与调优系统参数...

    mysql优化整理文档

    2. **工具推荐**:使用`OPTIMIZE TABLE`命令进行碎片整理。 #### 十、备份与恢复 1. **手动备份**:使用`mysqldump`命令进行数据库备份。 2. **自动备份**:通过设置定时任务自动执行备份脚本。 3. **恢复方法**:...

    MYSQL 优化常用方法实例教程

    1. 定期分析与优化表:使用ANALYZE TABLE和OPTIMIZE TABLE命令,更新统计信息,整理碎片。 2. 清理无用数据:定期删除或归档不再需要的数据,保持数据库整洁。 总结,MySQL优化是一个涉及多方面的工作,包括查询...

Global site tag (gtag.js) - Google Analytics