日期:2014-05-16  浏览次数:20489 次

数据库优化(1)---Schema设计的性能优化

模式设计的根本方案:

1.避免过多Join,较小重复开销;

2.减小空间,降低表扫描IO;

3.保证索引被及Query Cache被充分利用

总之,根据实际数据库访问需求,在三者之间寻找平衡,到达效率最优的目的。

?

高效的模型设计:

1.适度冗余,让Query减少Join。查询频率远远大于插于更新频率的时候,维护冗余数据一致性带来的性能开销对于查询提高的效率来说,是可以忍受的。通过少部分操作的成本换来更大(更频繁操作)的性能收获,是性能优化总经常使用的策略。Join几个表影响数据库优化执行计划。

2.大字段垂直分拆,summary表优化。分离大字段,通过单独的表存放,在我们访问数据库的收获大大降低了IO访问,从而使性能得到极大的改善。选择冗余和大字段分拆必须根据操作类型的分布来判定。只要满足相对访问频率低,就可分离出去。另外由于分离的大字段和原表记录是——对应的关系,因此Join的时候,性能影响也不是非常大。

3.大表水平分拆——基于类型的分拆优化。表数据空间很大,部分数据访问频率很高,与其他记录没有关联交互,记录量比普通记录少很多,这种情况,考虑将这部分的数据单独放在表中,避免普通记录的大量访问导致该部分数据的Query Cache失效。

4.统计表,准实时优化。将实时的统计需求,转化为定时任务,平衡实际需求和性能开销。

?

?

优化数据类型主要包括两个方面:

1.选用小数据类型,减少存储空间,降低查询数据IO;

2.合理数据类型加速数据的比较

?

数据类型:

类型 存储长度(字节) 最小值(无符号) 最大值(有符号)
整型数字
TINYINT 1 -2^7(0) 2^7-1(2^8)
SMALLINT 2 -2^15(0) 2^15-1(2^16)
MEDIUMINT 3 -2^23(0) 2^23-1(2^24)
INT 4 -2^31(0) 2^31-1(2^32)
BIGINT 8 -2^63(0) 2^63-1(2^64)
小数支持
FLOAT 4 or 8
DOUBLE 8
时间类型
DATETIME 8 1001-01-01 00:00:00 9999-12-31 23:59:59
DATE 3 1001-01-01 9999-12-31
TIME 3 00:00:00 23:59:59
YEAR 1 1001 9999
TIMESTAMP 4 1970-01-01 00:00:00
字符存储类型(字符为单位,字符所占字节由具体的存储字节决定 , 设字符所在字节为定值 X)
CHAR(M) M*X X 255*X(不一定,GBK510字节)
VARCHAR(M) M*X+1或者 M*X+2 1 255字符 或者 65535字节

TINYTEXT、TEXT、

MEDIUMTEXT、LONGTEXT

—— —— 动态存储长度,+ 存放字符长度的空间
其他类型
BIT(M) (M+7)/8字节 1 (64+7)/8
ENUM('v1','v2'...) 1~2 1 取决于存储数目,最大65536个值,枚举索引两个字节