优化数据库对象

在数据库设计过程中,用户可能会经常会被一个问题缠绕:是否应该把所有表都按照第三范式来设计?表里面的字段到底该设置为多大长度合适?这些问题虽然小,但是如果设计不当则可能会给将来的应用带来很多的性能问题。

[color=red][b]1. 优化表的数据类型[/b][/color]
表需要使用何种数据类型,是需要根据应用来判断的,虽然应用设计的时候需要考虑字段的长度留有一定的冗余,但是不赞成让很多字段都留有大量的冗余,这样既浪费磁盘存储空间,同时在应用程序操作时也浪费物理内存。

在MySQL中,可以使用函数PROCEDUER ANALYSE()对当前应用的表进行分析,该函数可以对数据表中列的数据类型提出优化建议,用户可以根据实际情况酌情考虑是否进行优化。
[quote]
SELECT * FROM table_name PROCEDUER ANALYSE();
SELECT * FROM table_name PROCEDUER ANALYSE(16,256);
[/quote]
输出的每一列信息都会对数据表中的列的数据类型提出优化建议。以上第二句表示PROCEDUER ANALYSE()不要为那些包含的值大于16个或者256字节的ENUM类型提出建议。如果没有这样的限制,输出信息可能很长;ENUM定义通常很难阅读。

通过PROCEDUER ANALYSE()函数的输出信息,用户可能会发现,一些表中的字段可以修改为效率更高的数据类型。如果决定改变某个字段的类型,则需要使用ALTER TABLE语句。

[color=red][b]2. 通过拆分提高表的访问效率[/b][/color]
这里所说的“拆分”,是指对数据表进行拆分。如果针对MyISAM类型的表进行,那么有两种拆分方法。
[b] 2.1 第一种方法是垂直拆分,即把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。[/b]
[quote]
如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直拆分,另外垂直拆分可以使得数据行变小,一个数据页就能存放更多的数据,在查询时候就会减少I/O次数。其缺点是需要管理冗余列,查询所有数据需要联合(JOIN)操作。
[/quote]

[b] 2.2 第二种方法是水平拆分,即根据一列或多列数据的值把数据列放到两个独立的表中。[/b]
[quote]
水平拆分通常在以下几种情况下使用:
a. 表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。
b. 表中的数据本来就有独立性,例如,表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些不常用。
c. 需要把数据存放到多个介质上。

例如: 移动电话的账单表就可以分成两个或者多个表。最近3个月的账单数据存储在一个表中,3个月以前的历史账单存放在另外一个表中。超过1年的又可以存储在介质上。这种拆分是最常用使用的水平拆分方法。

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

[b][color=red]3. 使用中间表提高统计查询速度[/color][/b]
对于数据量较大的表,在其上进行统计查询通常效率很低,并且还要考虑统计查询是否会对在线的应用产生负面影响。通常在这种情况下,使用中间表可以提高统计查询的效率,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值