几招省磁盘空间的方法

   我们在工作中时常会遇到一些客户的TPS\QPS都不太高,但磁盘占用非常大,一旦单实例空间太大,像内存、网络、CPU以及备份都将增加相应的开销。可能仅仅是由于空间不满足使得我们不得不进行扩容,下面的方法提供给大家参考。有则改之无则加勉。

   1、表结构设计上

   1) 字符集是否遵循了最小化原则?(能用latin的就不用gbk。能用gbk的就不用utf8)

   2) 索引上是否有滥用?(根本不使用的字段建索引、不适合建索引的字段建索引、重复建索引或者不能很好的利用前缀索引等)

   3) 冗余字段是否太多?(各表中不用的或者字段冗余太多)

   4) 不正确的字段类型?(能用1个字节非要用几个字节,像枚举类、状态类比较常见)

   5) 将较长的字段或者几个字段组合做为主键?(主键最好用mysql自增)

   具体事例如下:

   CREATE TABLE `class_meta` (

   `class_name` varchar(128) NOT NULL COMMENT ‘类名’,

   `class_desc` varchar(2048) default ” COMMENT ‘类的描述’,

   `class_status` char(20) default ‘test1′ COMMENT ‘test1,test2′,

   PRIMARY KEY (`class_name`),

   UNIQUE KEY `cm_cn_uk` (`class_name`),

   KEY `cm_cd_ind` (`class_desc`(767)),

   KEY `cm_cs_ind` (`class_status`),

   KEY `cm_cdcn_ind` (`class_desc`(767),`class_name`)

   ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT=’meta信息’;

   通过上面的表结构能看到如下地方不合适

   1、主键与唯一索引明显重复,索引cm_cd_ind与索引cm_cdcn_ind索引重复(这种情况经常出现,大家留意下)

   2、cm_cs_ind如果两个状态分布均匀也明显不合适建索引

   3、class_desc由于是描述性质的,也不合适建索引

   4、最好以自增做为主键,可以减少整表的空间

   5、class_status列明显可以用tinyint来存,可以省下19个字节

   2、存储内容上

   1) 是否将图片、视频、音乐等大数据存储在表中?(表里最好只保留路径而不是实际的文件内容)

   3、数据保留上

   1)是否有已过期而未删除的数据?(对于无效数据及时清理或者进行历史归档)

   4、后期维护上

   1)是否对经常删除的表进行维护(optimize table)

   建议:

   1、在性能要求不高的case中(并发不太高),可以考虑使用压缩表。一般压缩率在30%-70%之间,收益非常可观。

   2、对于删除非常频繁的表要定期进行优化,使表中碎片减少。提高查询、写入的性能。

   3、在表结构设计上,一定要发扬“斤斤计较”的精神,能用1个字节表示的坚决不用2个字节。

   4、尽量减少大字段的使用。

   ps:经常在跟开发评审表结构的时候,时常会被笑话说DBA太抠门,一点都不大气。当数据量小的时候可能大家不觉得,但当你的数据级到T或者P的时候,哪怕多省几个字节都是非常可观的,给大家简单算笔账,如果我们将一张5亿条记录的表,字段从100个字节降到60个字节(应该很容易做到吧),那么不算上索引将节约大约18G的空间。

抱歉猜想失败,您看看下面的文章有用吗?

  • 2009 年 2 月 17 日 -- MySQL优化 — 频繁创建临时表
  • 2009 年 2 月 15 日 -- Mysql Explain 举例详解
  • 2013 年 2 月 19 日 -- MySQL下实现闪回的设计思路 (MySQL Flashback Feature)
  • 2010 年 9 月 29 日 -- MySQL锁机制/管理(并发锁,行锁,表锁,预加锁,全局锁等等)
  • 2009 年 10 月 4 日 -- mysql基本连接,mysqli,pdo,adodb,pearDB之间的区别
  • 2013 年 8 月 26 日 -- slow log中出现大量的binlog dump记录
  • 2013 年 2 月 28 日 -- 量化InnoDB group commit的效果
  • 2012 年 12 月 23 日 -- MySQL TPCH测试工具简要手册
  • 2008 年 10 月 27 日 -- MySQL DBA 管理常用命令
  • 2013 年 9 月 15 日 -- MySQL数据库InnoDB存储引擎在线加字段实现原理详解

你可能感兴趣的:(MySQL优化设计,空间)