在数据库设计的过程中,用户可能会有疑问:是否所有表都应该按照第三范式来设计?表中的字段设置多大

长度合适?这些小问题,也需要谨慎对待,合理设计,此后也需要对MySQL中一些数据库对象进行优化。

 

1、优化表的数据类型

  原则上,表需要使用何种数据类型是需要根据应用来判断的;需要有一些冗余,但是不推荐很多字段都有大量冗余。

  MySQL中,可以使用函数PROCEDURE ANALYSE()对当前的表进行分析,该函数会对数据表中列的数据类型提出优化建议,

用户可以根据应用的实际情况酌情选择是否实施优化。

 

select * from table_name procedure analyse();
  select * from table_name procedure analyse(16,256);

  以上第二个语句告诉procedure analyse()不要为哪些包含的值对于16个或者256个字节的ENUM类型提出建议,因为ENUM类型通常很难阅读。

  表中数据量越大,给出的建议越合理。根据建议我们可以使用alter table table_name modify ...来修改对应的列。

 

2、通过拆分表来提高访问效率

  这里所说的拆分,是指对数据表进行拆分。如果针对MyISAM类型的表进行,那么有两种拆分方式(InnoDB也适用):

1)垂直拆分:即把主码和一些列当道一个表中,把主码和另外的列放到另一个表中。

  如果一个表中有一些列常用,另一些列不常用,则可以采用垂直拆分;垂直拆分,一个是的数据行变小,一个数据页就能

存放更多的数据,在查询时就会减少IO次数。缺点是,要管理冗余列,查询所有数据需要联合(JOIN)操作。

 

2)水平拆分:即根据一列或者多列数据的值将数据行放到两个独立的表中。

水平拆分通常在以下几种情况下使用:

  • 表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。
  • 表中的数据本来就有独立性,例如:表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,有些数据不常用。
  • 需要把数据存放到多个介质上。  

 例如:移动电话的账单表就可以分成两个表或者多个表。最近3个月的账单数据存在一个表中,3个月前的历史账单存放在另外一个表中,

超过1年的历史账单就可以存储到单独的存储介质上,这种拆分是最常使用的水平拆分方法。

  水平拆分会给应用增加复杂度,他通常在查询时需要多个表名,需要UNION操作。许多时候,这种复杂性会超过他带来的有点,故要根据实际

情况决定是否需要对表进行水平拆分。

 

3、逆规范化

  对于查询较多的应用,要根据实际情况运用逆规范化对数据进行设计,通过逆规范化来提高查询的性能。因为规范化越高,产生的关系就越多,关系

过多的直接结果就是导致表之间的连接操作频繁,而表之间的连接操作是性能较低的操作,直接影响查询速度。

  反规范化带来的好处是降低连接操作的需求、降低外码和索引的数目,还可能减少表的数目,相应带来的问题是可能出现数据的完整性问题。加快

查询速度,会降低修改速度。一般来说好的索引和其他方法经常能够解决性能问题,而不必采用范规范化方法。

  常用的反规范化技术有:增加冗余列,增加派生列,重新组表和分割表。

  逆规范化需要维护数据的完整性,方法有:批处理维护(定时跑存储过程,实时性不高)、应用逻辑维护(太复杂,容易遗漏)、触发器(实时的)。

 

4、使用中间表提高统计查询速度

  对于数据量较大的表,在其上做统计查询通常效率会很低,并且还要考虑统计查询是够会对在线的应用产生影响。通常在这种情况下,使用中间表

可以提高统计查询的效率。

  中间表在统计查询中经常会用到,有点如下:

  • 中间表复制源表部分数据,并且与源表相“隔离”,在中间表上做统计查询不会对在线应用产生负面影响。
  • 中间表上可以灵活的添加索引或者增加临时用的新字段,从而达到提高统计查询效率和辅助统计查询作用。