MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 4692|回复: 2
打印 上一主题 下一主题

[表及表类型] MySQL碎片管理疑问

[复制链接]
win1027 该用户已被删除
跳转到指定楼层
1#
发表于 2013-4-11 08:43:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
2#
发表于 2013-4-11 10:26:02 | 只看该作者
当然两亿条数据在现网操作实在是太不切实际了。

那么探讨一下:
经过一段时间的运行,大量的增删会给表产生碎片。

如何判断:正如文章中所提示,我们不仅仅只看DATA_FREE,更多看看实际数据库总体大小情况,然后跟实际数据库文件在磁盘的大小来对比。设置一个百分比,如果超过我们的设置,认为碎片过多,需要优化。
  1. 数据库大小:
  2. SELECT count(*) TABLES,table_schema,
  3. concat(round(sum(table_rows)/1000000,2),'M') rows,
  4. concat(round(sum(data_length)/(1024*1024*1024),2),'G') DATA,
  5. concat(round(sum(index_length)/(1024*1024*1024),2),'G') idx,
  6. concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') total_size,
  7. round(sum(index_length)/sum(data_length),2) idxfrac
  8. FROM information_schema.TABLES
  9. GROUP BY table_schema
  10. ORDER BY sum(data_length+index_length) DESC LIMIT 10;
复制代码
当然也可以正对某个表大小做对比,单独dump出某个表,然后和数据库中的统计做对比:
  1. 某数据库中表大小统计:
  2. SELECT TABLE_NAME,
  3. CONCAT(ROUND(table_rows/1000000,2),'M') ROWS,
  4. CONCAT(ROUND(data_length/(1024*1024*1024),2),'G') DATA,
  5. CONCAT(ROUND(index_length/(1024*1024*1024),2),'G') idx,
  6. CONCAT(ROUND((data_length+index_length)/(1024*1024*1024),2),'G') total_size,
  7. ROUND(index_length/data_length,2) idxfrac
  8. FROM information_schema.TABLES
  9. WHERE table_schema LIKE 'YOUDB'
  10. ORDER BY data_length+index_length DESC LIMIT 5;
复制代码
优化碎片:
好了,如果对比数据差异较大,那么就碎片量也相对较大,就需要优化了。
只说说对单个大表吧:
用dump出来,重建新表,再导入或load进数据。这个要比直接“ALTER TABLE foo ENGINE=InnoDB;”快很多。
当然此过程中需要暂停服务。
那么如何可以不暂停服务呢?做个Replication,主备机模式,先停同步,如上方法操作备机,然后打开同步,直到同步追上,切换主备。



win1027 该用户已被删除
3#
 楼主| 发表于 2013-4-11 10:58:26 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-4-20 00:49 , Processed in 0.085638 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表