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的空间。
今天有个同事来问我,说mysql目录下有很多1.1G的mysql-bin.00000* 文件,占用了100多G,占用磁盘空间非常大,这些文件都是msyql日志文件,从几m到几个G都有可通,要解决这个问题并不难,只要修改/etc/my.cnf文件里的 #log-bin=mysql-bin 和 #binlog_format=mixed 把这二行注释掉,重启数据库就可以了!你是使用过程中磁盘不断减少,还是安装过程中减少。如果是使用过程中的话,那应该是日志文件太大了。安装过程中出现的话,请检查D盘点剩余空间有多大。对我有用[0]丢个板砖[0]引用举报管理TOPwwwwb等
级:92423
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)