一、索引的分类
序号 | 索引名称 | 中文含义 |
1 | B*索引 | 最经典、最常用的索引 |
2 | Primary Key | 主键、也是也是一种索引 |
3 | Unique Key | 唯一索引 |
4 | Function-Based Index | 函数索引 |
5 | Composite Index | 多字段复合索引 |
6 | Reverse Index | 反转索引 |
7 | Bitmap Index | 位图索引 |
8 | Cluster Index | 聚簇索引 |
9 | Cluster-Hash Index | 簇哈希索引 |
10 | Local Prefix Partitioned Index | 本地前缀分区索引 |
11 | Local non-Prefix Partitioned Index | 本地非前缀分区索引 |
12 | Global Range-Partitioned Index | 全局范围分区索引 |
13 | Global Hash-Partitioned Index | 全局哈希分区索引 |
14 | Context Index | 全文搜索索引 |
15 | CTXCA Index | 文献目录索引 |
16 | CTXRULE Index | 文献分类索引 |
17 | CTXXPASTH Index | XML类型的全文索引 |
18 | Bitmap-join Index | 位图连接索引 |
19 | ………… | ………… |
虽然Oracle提供了如此多的索引,但是在实际中常用的索引类型也就那么几种
OLTP——联机事务处理,可以简单认为是我们的业务系统,有大量DML操作
OLAP——联机事务分析处理,可以简单认为是数据仓库,基本上都是查询操作
二、B*树索引(用于OLTP)
B树索引是Oracle默认索引类型,也是最常用的索引,该类索引有许多好处:
1、针对唯一值或小范围的数据的访问时非常快。特别适合与精度匹配查询与范围查询
2、B*树可以自动进行平衡
3、虽然过多的B树索引会影响DML操作,但是单个B*树索引对DML操作的影响是很小的
4、大多数情况下,B*树索引可以随着数据量的增长而很好的进行扩展
B*树单字段索引使用建议
1、分析SQL语句中约束条件的字段
2、如果条件字段不固定,可以针对单字段建立普通B*树索引
3、针对可选性高的字段建立索引
4、如果是多表连接,可以考虑在被驱动表上的连接字段加索引
5、通过对SQL语句进行分析,查看执行计划来进行优化
三、位图索引(用于OLAP)
位图索引是用来改善基于有很少列值的行的访问速度,例如中国有十几亿人口,那么民族至于56个,那么针对民族代码就可以建立位图索引;
在OLTP中一般不使用位图索引
四、函数索引
如下情况:WHERE 1=1 AND (sysdate-to_date(DT_TIME,'yyyymmddhh24miss'))*24*60<10
在DT_TIME上面加上了索引,但是发现执行计划并没有按照索引来,这里其实是Oracle的一个缺陷了,
例如:DT_TIME-7<sysdate 与 DT_TIME<sysdate+7 在我们看来是一样的,但是在Oracle眼里却是不一样的,前面的表达式不会走索引,而后面的表达式就会走索引
针对上述情况,如果索引字段在函数里面,要么简历函数索引,要么就优化表达式。但是建立函数索引有一些限制
函数索引限制:
1、必须使用一个确定的函数定义基于该函数的索引,也就是说函数仅返回一个值
2、必须使用返回可重复值的函数来定义基于该函数的索引,如sysdate就不行
3、可以对基于函数的索引进行分区,但是对基于函数的全局分区索引来说,分区键不能是索引所基于的函数
4、函数必须使用圆括号来定义,即使没有参数
5、索引基于的函数不能包含聚合函数
使用建议:
1、不要轻易在字段前面加函数
2、尽量不要将字段嵌入表达式中
3、尽量减少使用函数索引,能不用就不用,因为函数索引的维护代价比普通索引高;函数索引计算值可能大于原字段值,将消耗更多的存储空间
五、复合索引
在大多数情况下,复合索引比单字段索引号,因为可以过滤出更多数据,精确定位。但是要考虑实际情况,不能滥用,不能乱用。
复合索引设计原则:
1、前缀性
也就是说到底把那个字段放在第一个未知呢,这个至关重要
例如:(col1,col2,col3)这个索引包含三个字段
针对上面的几个SQL语句,到底谁会走索引,谁不走索引你。
其实只要含有col1='SSSS'条件的语句都会走索引
这就是为什么第一个字段为什么这么重要的原因了
2、可选性
就是用于索引的字段的非重复数据必须多,像用性别来做索引字段就行不通。
将字段可选性越多的字段放到前面
复合索引使用建议:
1、分析SQL语句中约束条件字段
2、约束条件比较固定的,优先采用B*树复合索引
3、单个字段是主键、唯一键或则其他可选性很高的字段可以建立单字段索引,节省索引开销
4、在建立复合索引的时候,优先考虑其前缀性,其次是可选性
5、如果涉及到几个条件使用频繁,但是查询组合不固定,可以分别建立单字段索引
6、如果是多表连接,可以考虑在被驱动表的连接字段与该表的其他字段创建复合索引
7、通过查看SQL语句执行计划进行分析
六、索引维护
1、索引并不是越多越好,因为索引会影响DML操作并且本身也会消耗存储,因此删掉没有使用的索引
2、索引碎片整理,可以定期重建压缩索引
alter index ix_name rebuild;
alter index ix_name coalesce;