日期:2014-05-16 浏览次数:20495 次
模式设计的根本方案:
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个值,枚举索引两个字节 |