(四)mysql优化之数据库表设计优化

(4)mysql优化之数据库表设计优化

概述

在数据库设计过程中,用户可能会经常遇到这样的问题:1.表里面的字段到底该设置多长合适?2.是否应该把所有表都按照第三范式来设计?

优化表的数据类型

1.语法

表的数据类型参见链接:
http://blog.csdn.net/pursuing0my0dream/article/details/44729707

在mysql中,我们可以使用函数 procedure analyse()对数据库中的表进行分析,该函数可以对数据表中的列的数据类型提出优化建议。

#语法
select * from table_name procedure analyse();
#或
select * from table_name procedure analyse(element_num,max_memory);

第2个语句中告诉该函数不要为那些包含的值多于element_num个或者max_memory个字节的enum类型提出建议。如果没有这些限制,输出信息可能很长,enum类型定义通常很难阅读。

2.举例

SELECT * FROM c PROCEDURE ANALYSE(16,255);

(四)mysql优化之数据库表设计优化
field_name 对于表哪个字段,optimal_fieldtype给出优化建议。

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

对数据表的拆分,分为两种拆分方式:垂直拆分,水平拆分

1.垂直拆分(分表)

即把主键和一些数据表的列放在一个表中,然后把主键和另一些数据表的列放在一个表中。
如果一个表的某些列常用,另一些不常用,则可以采用垂直拆分。垂直拆分可以使数据行变小,一个数据页就可以存放更多的数据,在查询时候可以减少I/O次数。其缺点是需要管理冗余列,查询所有数据时候需要join查找。

2.水平拆分(分表,分区)

即把数据表中的列根据一定规则放在多个独立的表或分区中。水平拆分使用场景:

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

逆规范化

 &esmsp;在数据库设计中,规范化越高,那么产生的关系就越多,直接导致表与表之间的join操作越频繁,而join操作又是一种性能比较低的操作,直接影响到查询的速度。
  反规范化的好处是降低了join操作的需求,降低了外键和索引数目。还可以减少表的个数,相应的带来的问题是可能出现数据的完整性问题。加快查询速度,但会降低修改速度。