设为首页 加入收藏

TOP

每天进步一点点――――数据库对象优化(一)
2015-11-21 01:50:41 来源: 作者: 【 】 浏览:2
Tags:每天 进步 一点点 数据库 对象 优化

?

1. 优化表的数据类型

在MySQL中,可以使用函数procedure analyse()对当前应用的表进行分析,该函数可以对数据表中列的数据类型提出优化建议,用户可以根据应用的实际情况酌情考虑是否实施优化。

以下是函数的使用方法

select* from 表名 PROCEDUREANALYSE();

SELECT* FROM 表名 procedureanalyse(16,256)————表示不要为那些包含的值多余16个或者256个字节的ENUM类型提出建议。

例如:

mysql>select * from emp procedure analyse()\G;

*************************** 1. row***************************

Field_name: test2.emp.id ————列

Min_value: 2 ————最小值

Max_value: 55 ————最大值

Min_length: 1 ————最小长度

Max_length: 2 ————最大长度

Empties_or_zeros: 0

Nulls: 0

Avg_value_or_avg_length: 16.6000

Std: 15.0280

Optimal_fieldtype: ENUM('2','4','5','10','11','12','15','25','27','55')NOT NULL ——建议更改值

*************************** 2. row***************************

Field_name: test2.emp.ename

Min_value: bzfys

Max_value: bzfys

Min_length: 5

Max_length: 5

Empties_or_zeros: 0

Nulls: 0

Avg_value_or_avg_length: 5.0000

Std: NULL

Optimal_fieldtype: ENUM('bzfys') NOT NULL

*************************** 3. row***************************

Field_name: test2.emp.hired

Min_value: 1970-01-01

Max_value: 1970-01-01

Min_length: 10

Max_length: 10

Empties_or_zeros: 0

Nulls: 0

Avg_value_or_avg_length: 10.0000

Std: NULL

Optimal_fieldtype: ENUM('1970-01-01') NOT NULL

*************************** 4. row***************************

Field_name: test2.emp.separated

Min_value: 9999-12-31

Max_value: 9999-12-31

Min_length: 10

Max_length: 10

Empties_or_zeros: 0

Nulls: 0

Avg_value_or_avg_length: 10.0000

Std: NULL

Optimal_fieldtype: ENUM('9999-12-31') NOT NULL

*************************** 5. row***************************

Field_name: test2.emp.job

Min_value: aac

Max_value: aac

Min_length: 3

Max_length: 3

Empties_or_zeros: 0

Nulls: 0

Avg_value_or_avg_length: 3.0000

Std: NULL

Optimal_fieldtype: ENUM('aac') NOT NULL

*************************** 6. row***************************

Field_name: test2.emp.store_id

Min_value: 20

Max_value: 20

Min_length: 2

Max_length: 2

Empties_or_zeros: 0

Nulls: 0

Avg_value_or_avg_length: 20.0000

Std: 0.0000

Optimal_fieldtype: ENUM('20') NOT NULL

6 rows in set (0.00 sec)

?

ERROR:

No query specified

然后可以通过以下命令修改字段类型(自己根据业务考虑是否要更改)

mysql>alter table emp modify ename ENUM('bzfys') NOT NULL;

Query OK, 10 rows affected (0.18 sec)

Records: 10 Duplicates: 0 Warnings: 0

?

?

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

这里锁说的“拆分”,是指的对数据表进行拆分。

针对MyISAM类型的表进行,那么有两种拆分方法

1、第一种方法是垂直拆分,即把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中

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

2、第二种方法是水平拆分,即根据一列或者多列数据的值把数据行放到两个独立的表中。

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

1)表很大,分割后可以降低在查询时需要读取的数据和索引的页数,同事也降低了索引的层数,提高查询速度。

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

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

水平拆分会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要UNION操作。

3. 逆规范化

数据库设时要求满足归法换,这个道理大家都清楚,但是是否数据的规范化程度越高越好呢?这个由实际需求来决定。

反规范的好处是降低连接操作的需求、降低外码和索引的数目,还能减少表的数目,相应带来的问题是可能出现数据完整性问题。加快查询速度,但会降低修改速度。因此,决定做逆规范时,一定要权衡利弊,仔细分析应用的数据存取需求和实际的性能特点,好的索引和其他方法经常能够解决性能问题,而不必采用范规范这种方法。

?

在进行反规范操作之前,要充分考虑数据的存取需求、常用表的大小、一些特殊的计算、数据的物理存储位置等。常用的反规范技术有增加冗余列、增加派生列、重新组表和分割表。

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

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

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

分割表:垂直拆分或者水平拆分。

另外,逆规范技

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇关于MongoDb的简单入门 下一篇你印象中似知非知的NOSQL数据库

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: