创建索引要做到三个适当
在 Oracle 数据库中,创建索引虽然比较简单。但是要合理的创建索引则比较
困难了。笔者认为,在创建索引时要做到三个适当,即在适当的表上、适当的
列上创建适当数量的索引。虽然这可以通过一句话来概括优化的索引的基本准
则,但是要做到这一点的话,需要数据库管理员做出很大的努力。具体的来说,
要做到这个三个适当有如下几个要求。
一、 根据表的大小来创建索引。
虽然给表创建索引,可以提高查询的效率。但是数据库管理员需要注意的
是,索引也需要一定的开销的。为此并不是说给所有的表都创建索引,那么就
可以提高数据库的性能。这个认识是错误的。恰恰相反,如果不管三七二十一,
给所有的表都创建了索引,那么其反而会给数据库的性能造成负面的影响。因
为此时滥用索引的开销可能已经远远大于由此带来的性能方面的收益。所以笔
者认为,数据库管理员首先需要做到,为合适的表来建立索引,而不是为所有
的表建立索引。
一般来说,不需要为比较小的表创建索引。如在一个 ERP 系统的数据库中,
department 表用来存储企业部门的信息。一般企业的部分也就十几个,最多
不会超过一百个。这 100 条记录对于人来说,可能算是比较多了。但是对于计
算机来说,这给他塞塞牙缝都还不够。所以,对类似的小表没有必要建立索引。
因为即使建立了索引,其性能也不会得到很大的改善。相反索引建立的开销,
如维护成本等等,要比这个要大。也就是说,付出的要比得到的多,显然违反
常理。
另外,就是对于超大的表,也不一定要建立索引。有些表虽然比较大,记
录数量非常的多。但是此时为这个表建立索引并一定的合适。如系统中有一张
表,其主要用来保存数据库中的一些变更信息。往往这些信息只给数据库管理
员使用。此时为这张表建立索引的话,反而不合适。因为这张表很少用到,只
有在出问题的时候才需要查看。其次其即使查看,需要查询的纪录也不会很多,
可能就是最近一周的更新记录等等。对于对于一些超大的表,建立索引有时候
往往不能够达到预计的效果。而且在打表上建立索引,其索引的开销要比普通
的表大的多。那么到底是否给大表建立索引呢?笔者认为,主要是看两个方面的
内容。首先是需要关注一下,在这张大表中经常需要查询的记录数量。一般来
说,如果经常需要查询的数据不超过 10%到 15%的话,那就没有必要为其建
立索引的必要。因为此时建立索引的开销可能要比性能的改善大的多。这个比
例只是一个经验的数据。如果数据库管理员需要得出一个比较精确的结论,那
么就需要进行测试分析。即数据库管理员需要测试一下全表扫描的时间,看看
其是否比建立索引后的查询时间要长或者短。如果是长的话,则说明有建立索
引的必要。但是如果没有的话,则说明还是全表扫描速度来的快。此时也就没
有必要建立索引了。
总之,在考虑是否该为表建立索引时,一般来说小表没有建立索引的必要。