zoukankan      html  css  js  c++  java
  • MysqL碎片整理优化

    先来说一下什么是碎片,怎么知道碎片有多大!

    简单的说,删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来.于是造成了数据的存储位置不连续,以及物理存储顺序与理论上的排序顺序不同,这种是数据碎片.实际上数据碎片分为两种,一种是单行数据碎片,另一种是多行数据碎片.前者的意思就是一行数据,被分成N个片段,存储在N个位置.后者的就是多行数据并未按照逻辑上的顺序排列.当有大量的删除和插入操作时,必然会产生很多未使用的空白空间,这些空间就是多出来的额外空间.索引也是文件数据,所以也会产生索引碎片,理由同上,大概就是顺序紊乱的问题.Engine 不同,OPTIMIZE 的操作也不一样的,MyISAM 因为索引和数据是分开的,所以 OPTIMIZE 可以整理数据文件,并重排索引。这样不但会浪费空间,并且查询速度也更慢。

    解决方案:(切记,一定要在夜里执行,表越大,越耗资源时间,不要频繁修复,可以几个月甚至一年修复一次,如果表频繁被更改,可以按周/月来整理。)

    查看表碎片的方法

    mysql> select ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH,MAX_DATA_LENGTH,DATA_FREE,ENGINE from TABLES where TABLE_SCHEMA='test_db' and TABLE_NAME='table_name' limit 1;

     

     通过OPTIMIZE TABLE table_name 后再查询一下结果如下

     

     也可以观察Mysql的数据目录存储文件Data文件大小,如MYD

    一、Innodb存储引擎清理碎片方法

    ALTER TABLE tablename ENGINE=InnoDB

    二、Myisam存储引擎清理碎片方法

    OPTIMIZE 操作会暂时锁住表,而且数据量越大,耗费的时间也越长,它毕竟不是简单查询操作.所以把 Optimize 命令放在程序中是不妥当的,不管设置的命中率多低,当访问量增大的时候,整体命中率也会上升,这样肯定会对程序的运行效率造成很大影响.比较好的方式就是做个 Script,定期检查mysql中 information_schema.TABLES字段,查看 DATA_FREE 字段,大于0话,就表示有碎片.脚本多长时间运行一次,可以根据实际情况来定,比如每周跑一次.

     OPTIMIZE TABLE table_name 
  • 相关阅读:
    软件架构方面基础-ESB SOA GEO-ESB
    超图软件上市 ——股票代码300036
    python第三方库——xlrd和xlwt操作Excel文件学习
    python -wordcloudan云词安装
    华为手机多屏互动功能使用
    IDL创建泰森多边形
    ArcGIS Engine开发基础总结(一)
    自己制作博客园打赏功能
    Linux学习之八--关闭firewall防火墙安装iptables并配置
    Linux学习之七--mysql的安装使用
  • 原文地址:https://www.cnblogs.com/wt645631686/p/8065099.html
Copyright © 2011-2022 走看看