首页 > 代码库 > MySQL--优化数据库对象

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 倍数据量,查询时也就增加读一个索引层的磁盘次数,所以水平拆分要考虑数据量的增长速度,根据实际情况决定是否需要对表进行水平拆分。

MySQL--优化数据库对象