MySQL--优化数据库对象

1) 优化表的数据类型

  • 表需要使用何种数据类型是需要根据应用来判断的。虽然应用设计的时候需要考虑字段的长度留有一些冗余,但是不推荐让很多字段都留有大量的冗余,这样既浪费磁盘存储空间,同时在应用程序操作时也浪费物理内存。
  • 在 MySQL 中,可以使用函数 PROCEDURE ANALYSE() 对当前应用的表进行分析,该函数可以对数据表中列的数据类型提出优化建议,用户可以根据应用的实际情况酌情考虑是否实施优化。
  • 以下是函数 PROCEDURE ANALYSE() 的使用方法:

      SELECT * FROM tbl_name PROCEDURE ANALYSE();

      SELECT * FROM tbl_name PROCEDURE ANALYSE(16, 256);

    输出的每一列信息都会对数据表中的列的数据类型提出优化建议。以上第二句告诉 PROCEDURE ANALYSE() 不要为那些包含的值多于 16 个或者 256 个字节的 ENUM 类型提出建议。

 

2) 通过拆分提高表的访问效率

  这里所说的拆分,是指对数据表进行拆分。如果针对 MyISAM 类型的表进行,那么有两种拆分方法。

2.1> 垂直拆分

  把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。

  如果一个表中某些列常用,而另一些列不常用,则可以采用垂直拆分,另外,垂直拆分可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少 I/O 次数。其缺点是需要管理冗余列,查询所有数据需要联合(JOIN)操作。

2.2> 水平拆分

  根据一列或多列数据的值把数据行放到两个独立的表中。水平拆分通常在以下几种情况下使用。
  表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。

  表中的数据本来就有独立性,例如,表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。

需要把数据存放到多个介质上。

  水平拆分会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要 UNION 操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加 2~3 倍数据量,查询时也就增加读一个索引层的磁盘次数,所以水平拆分要考虑数据量的增长速度,根据实际情况决定是否需要对表进行水平拆分。

 

3) 逆规范化

  • 规范化越高,产生的关系就越多,关系过多的直接结果就是导致表之间的连接操作越频繁,而表之间的连接操作是性能比较低的操作,直接影响到查询的速度。所以,对于查询较多的应用,就需要根据实际情况运用逆规范化对数据进行设计,通过逆规范化来提高查询的性能。
  • 反规范化的好处是降低连接操作的需求、降低外码和索引的数目,还可能减少表的数目,相应带来的问题是可能出现数据的完整性问题。加快查询速度,但会降低修改速度。因此,决定做反规范时,一定要权衡利弊,仔细分析应用的数据存取需求和实际的性能特点,好的索引和其他方法经常能够解决性能问题,而不必采用反规范这种方法。
  • 在进行反规范操作之前,要充分考虑数据的存取需求、常用表的大小、一些特殊的计算(例如合计)、数据的物理存储位置等。常用的反规范技术有增加冗余列、增加派生列、重新组表和分割表。

    增加冗余列:指在多个表中具有相同的列,它常用来在查询时避免连接操作。

    增加派生列:指增加的列来自其他表中的数据,由其他表中的数据经过计算生成。增加的派生列其作用是在查询时减少连接操作,避免使用集函数。

    重新组表:指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接而提高性能。

    分割表。

  • 逆规范化需要维护数据的完整性。无论使用何种反规范化技术,都需要一定的管理来维护数据的完整性,常用的方法是批处理维护、应用逻辑和触发器。

    批处理维护是指对复制列或派生列的修改积累一定的时间后,运行一批处理作业或存储过程对复制或派生列进行修改,这只能在对实时性要求不高的情况下使用。

    数据的完整性也可由应用逻辑俩实现,这就要求必须在同一事务中对所有涉及的表进行增、删、改操作。用应用逻辑来实现数据的完整性风险较大,因为同一逻辑必须在所有的应用中使用和维护,容易遗漏,特别是在需求变化时,不易于维护。

    另一种方式就是使用触发器,对数据的任何修改立即触发复制列或派生列的相应修改。触发器是实时的,而且相应的处理逻辑只在一个地方出现,易于维护。一般来说,是解决这类问题比较好的办法。

 

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

  • 对于数据量大的表,在其上进行统计查询通常会效率很低,并且还需要考虑统计查询是否会对在线的应用产生负面影响。通常在这种情况下,使用中间表可以提高统计查询的效率。
  • 中间表在统计查询中经常会用到,其优点如下:

    中间表复制源表部分数据,并且与源表相隔离,在中间表上做统计查询不会对在线应用产生负面影响。

    中间表上可以灵活的添加索引或增加临时用的新字段,从而达到提高统计查询效率和辅助统计查询作用。

posted @ 2017-04-18 16:59  MicroCat  阅读(274)  评论(0编辑  收藏  举报