合适的索引,能大幅度提升数据库表读的效率,但这里也不并不是说表上的索引越多越好。因此在数据库设计过程中,需要考虑创建索引的代价。在数据库中索引的维护代价约是表的3倍,并且数据表写和读两者不能兼得。如果要提高表写入性能,那么索引在一定程度上会阻碍数据的插入速度,因为数据库需要维护索引和维护数据原子性。
索引的种类有很多,常见的有B-树索引,位图索引,基于函数的索引,分区索引等等,而在现网的系统中使用的基本上就是B-树以及分区索引。
在数据仓库中使用最多的是分区和压缩技术,索引使用较少,应用层为了提高查询速度会适当在表上建立索引。
创建索引
索引命名规范
索引以IDX作为前缀标识,不能与表同名。在长度允许的情况下,最好能标识出该索引对应的表名和字段名。
建立索引的名称的原则是简洁和易于理解,索引命名采用如下的规范:
1. 普通索引:IDX_<简要表名>_<索引首字段名称>
例如在CS_REC_RECPTION表的INT_SERVERVER 字段上建立普通索引命名如下IDX_RECEPTION_SERVNUMBER
2. 唯一索引:UID_<简要表名>_<索引首字段名称>
例如在CS_REC_RECPTION表的INT_SERVERVER 字段上建立唯一索引命名如下UID_RECEPTION_SERVNUMBER
3. 主键:PK_<表名>
例如在CS_REC_RECPTION表的INT_SERVERVER 字段上建立主键索引命名如下PK_CS_REC_RECEPTION
在长度允许的情况下,最好能标识出该索引对应的表名和字段名。
建立B树索引
B树索引是现网数据库中最常见的索引类型之一,它适用范围比较广:
1.适合于拥有重复值较少的字段。数据重复值越少,查询数据选择性越高,使用索引查询数据的效率越高,反之则越低。
2.适用于对字段所在数据有少量修改的场合,例如字段有较少量的插入、修改、删除等情况,更新索引字段键值的代价适中。
3.适用于数据变化相对频繁的OLTP系统
4.需要占用较高的存储空间
建立位图索引
位图索引是数据分析系统中常见的索引类型之一
1.适合于拥有较高重复值的字段,数据重复值对索引查询的效率影响较少
2.适用于对字段所有数据只读或者极少修改的场合,更新索引字段键值将付出巨大的代价。
3.适用于数据变化很少的DSS数据分析系统。
4.需要较小的存储空间
建立哈希索引
Hash 索引只能处理简单的等于比较,当一个索引了的列涉及到使用 = 操作符进行比较的时候,查询规划器会考虑使用 Hash 索引。
1.Hash索引的性能不比B-tree索引强
2.Hash索引的创建时间会很长
3.如果发生了数据库崩溃,可能要重建Hash索引
4.基于以上原因不推荐使用Hash索引
建立基于函数索引
B-tree索引的一种,创建基于函数的索引,适用于以下两种情况:
1.基于对索引键值进行各种函数运算,例如对字符串字段进行大写转换upper()运算;
2,.基于对一个或者多个字段进行各种运算,例如对两个数值字段进行相加运算colA+colB等。
3.创建基于函数的索引,可以提高在查询条件中对索引使用基于特定函数的效率。因此,一个频繁执行并且需要对特定字段进行特定函数转换的查询语句。但是建立基于函数的索引,无法对使用字段本身或者对字段进行其它函数操作的查询语句起到优化的效果。
建立部分索引
部分索引是建立在一个表的子集上的索引。
部分索引的主要动机是为了避免对普通数值(大量重复的数值)建立索引。因为在普通数值上的查询就算使用索引也没什么好处,那么还不如从索引中剔除这些大量重复的行。这样可以减小索引尺寸,提高那些真正使用索引的查询的速度。同时它也能提高更新操作的速度,因为不是所有情况都需要更新索引
索引使用规范
1.不要把给经常变更的列建索引。全表扫描性能不好时才需要创建索引。
2.不要建重复的索引并给索引命名。
3.低基数的列用bitmap索引。单列的查询使用B-Tree索引。
4.加载数据的时候先drop掉索引,加载之后再重新创建索引。
5.扫描一个大表的子集时,使用部分索引。
6.重创建索引执行执行Analyze。