一、拆分表
这里所说的“拆分”,是指对数据表进行拆分。如果针对 MyISAM 类型的表进行,那么有
两种拆分方法。
1、第一种方法是垂直拆分,即把主码和一些列放到一个表,然后把主码和另外的列放
到另一个表中。
如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直拆分,另外垂直
拆分可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少 I/O 次
数。其缺点是需要管理冗余列,查询所有数据需要联合(JOIN)操作。
2、 第二种方法是水平拆分,即根据一列或多列数据的值把数据行放到两个独立的表中。
水平拆分通常在以下几种情况下使用:
a:表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了
索引的层数,提高查询速度。
b: 表中的数据本来就有独立性,例如,表中分别记录各个地区的数据或不同时期
的数据,特别是有些数据常用,而另外一些数据不常用。
c: 需要把数据存放到多个介质上。
水平拆分会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需
要 UNION 操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要
索引关键字不大,则在索引用于查询时,表中增加 2 至 3 倍数据量,查询时也就增加
读一个索引层的磁盘次数,所以水平拆分要考虑数据量的增长速度,根据实际情况决
定是否需要对表进行水平拆分。
二、逆规范化
数据库设计时要满足规范化这个道理大家都非常清楚,但是否数据的规范化程度
越高越好呢?这还是由实际需求来决定。因为规范化越高,那么产生的关系就越多,
关系过多的直接结果就是导致表之间的连接操作越频繁,而表之间的连接操作是性能
较低的操作,直接影响到查询的速度,所以对于查询较多的应用就需要根据实际情况
运用逆规范化对数据进行设计,通过逆规范化来提高查询的性能。
增加冗余列:指在多个表中具有相同的列,它常用来在查询时避免连接操作。 增加派生列:指增加的列来自其他表中的数据,由其他表中的数据经过计算生
成。增加的派生列其作用是在查询时减少连接操作,避免使用集函数。
重新组表:指如果许多用户需要查看两个表连接出来的结果数据,则把这两个
表重新组成一个表来减少连接而提高性能。
分割表:可以参见上面的内容。
逆规范需要维护数据的完整性!
1、批处理维护 是指对复制列或派生列的修改积累一定的时间后,运行一批处理作业或存储过程对复制或派生列进行修改,这只能在对实时性要求不高的情况下使用。
2、 数据的完整性也可由应用逻辑 来实现,这就要求必须在同一事务中对所有涉及的表进行增、删、改操作。用应用逻辑来实现数据的完整性风险较大,因为同一逻辑必须在所有的应用中使用和维护,容易遗漏,特别是在需求变化时,不易于维护。
3、 另一种方式就是使用触发器, 对数据的任何修改立即触发对复制列或派生列的相应修改。触发器是实时的,而且相应的处理逻辑只在一个地方出现,易于维护。一般来说,是解决这类问题比较好的办法。
三、中间表查询
1、中间表复制源表部分数据,并且与源表相“隔离”,在中间表上做统计查询不会对在线应用产生负面影响。
2、 中间表上可以灵活的添加索引或增加临时用的新字段,从而达到提高统计查询效率和辅助统计查询作用。
有的时候需要添加中间表,可以在中间表上加如索引,视图,之类的东西提高查询效率。