优化数据库对象
优化表的数据结构
在 MySQL 中,可以使用函数 PROCEDURE ANALYSE()对当前应用的表进行分析
SELECT * FROM tbl_name PROCEDURE ANALYSE();
SELECT * FROM tbl_name PROCEDURE ANALYSE(16,256);
通过拆分提高表的访问效率
针对 MyISAM 类型的表进行,那么有两种拆分方法 第一种方法是垂直拆分,即把主码和一些列放到一个表,然后把主码和另外的列放
到另一个表中。
如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直拆分,另外垂直
拆分可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少 I/O 次
数。其缺点是需要管理冗余列,查询所有数据需要联合(JOIN)操作。
第二种方法是水平拆分,即根据一列或多列数据的值把数据行放到两个独立的表中。
水平拆分通常在以下几种情况下使用:
1 表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了
索引的层数,提高查询速度。
2 表中的数据本来就有独立性
3 需要把数据存放到多个介质上
水平拆分会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需
要 UNION 操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要
索引关键字不大,则在索引用于查询时,表中增加 2 至 3 倍数据量,查询时也就增加
读一个索引层的磁盘次数,所以水平拆分要考虑数据量的增长速度,根据实际情况决
定是否需要对表进行水平拆分。
逆规范化
规范化越高,那么产生的关系就越多,关系过多的直接结果就是导致表之间的连接操作越频繁,而表之间的连接操作是性能
较低的操作,直接影响到查询的速度,所以对于查询较多的应用就需要根据实际情况
运用逆规范化对数据进行设计,通过逆规范化来提高查询的性能
在进行反规范操作之前,要充分考虑数据的存取需求、常用表的大小、一些特殊
的计算(例如合计)、数据的物理存储位置等
增加冗余列 增加派生列 重新组表 分割表
批处理维护、应用逻辑和触发器来管理维护数据的完整性
使用中间表提高统计查询速度
中间表在统计查询中经常会用到,其优点如下: 中间表复制源表部分数据,并且与源表相“隔离”,在中间表上做统计查询不
会对在线应用产生负面影响。
中间表上可以灵活的添加索引或增加临时用的新字段,从而达到提高统计查询
效率和辅助统计查询作用。
小结
本章介绍了对数据库对象的优化,数据库对象设计的好坏是一个数据库设计的基础,而且一旦数据库对象设计完毕并投入使用,将来再进行修改就比较麻烦,因此在进行数据库设计的
时候一定要尽可能地考虑周到。