数据库创建索引经常使用的规则以下: 一、表的主键、外键必须有索引; 二、数据量超过300的表应该有索引; 三、常常与其余表进行链接的表,在链接字段上应该创建索引; 四、常常出如今Where子句中的字段,特别是大表的字段,应该创建索引; 五、索引应该建在选择性高的字段上; 六、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 七、复合索引的创建须要进行仔细分析;尽可能考虑用单字段索引代替: A、正确选择复合索引中的主列字段,通常是选择性较好的字段; B、复合索引的几个字段是否常常同时以AND方式出如今Where子句中?单字段查询是否 极少甚至没有?若是是,则能够创建复合索引;不然考虑单字段索引; C、若是复合索引中包含的字段常常单独出如今Where子句中,则分解为多个单字段索引; D、若是复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减小复合的字段; E、若是既有单字段索引,又有这几个字段上的复合索引,通常能够删除复合索引; 八、频繁进行数据操做的表,不要创建太多的索引; 九、删除无用的索引,避免对执行计划形成负面影响; 以上是一些广泛的创建索引时的判断依据。 索引的创建必须慎重,对每一个索引的必要性都应该通过仔细分析,要有创建的依据。 由于太多的索引与不充分、不正确的索引对性能都毫无益处:在表上创建的每一个索引都会增长存储开销,索引对于插入、删除、更新操做也会增长处理上的开销。 另外,过多的复合索引,在有单字段索引的状况下,通常都是没有存在价值的;相反,还会下降数据增长删除时的性能,特别是对频繁更新的表来讲,负面影响更大。 总的来讲,小型表确定不建索引, 或者数据库记录在亿条数据级以上,仍是建议使用非关系型数据库。 还有些特殊字段的数据库,好比BLOB,CLOB字段确定也不适合建索引。 其实这个问题更感受偏向于作软件项目的一种经验。
1、注意事项:
首先,应当考虑表空间和磁盘空间是否足够。咱们知道索引也是一种数据,在创建索引的时候势必也会占用大量表空间。所以在对一大表创建索引的时候首先应当考虑的是空间容量问题。
其次,在对创建索引的时候要对表进行加锁,所以应当注意操做在业务空闲的时候进行。
2、性能调整方面:
首当其冲的考虑因素即是磁盘I/O。物理上,应当尽可能把索引与数据分散到不一样的磁盘上(不考虑阵列的状况)。逻辑上,数据表空间与索引表空间分开。这是在建索引时应当遵照的基本准则。
其次,咱们知道,在创建索引的时候要对表进行全表的扫描工做,所以,应当考虑调大初始化参数db_file_multiblock_read_count的值。通常设置为32或更大。
再次,创建索引除了要进行全表扫描外同时还要对数据进行大量的排序操做,所以,应当调整排序区的大小。
9i以前,能够在session级别上加大sort_area_size的大小,好比设置为100m或者更大。
9i之后,若是初始化参数workarea_size_policy的值为TRUE,则排序区从pga_aggregate_target里自动分配得到。
最后,创建索引的时候,能够加上nologging选项。以减小在创建索引过程当中产生的大量redo,从而提升执行的速度。mysql
MySql在创建索引优化时须要注意的问题
|