索引:
提高查询语句的效率
一、何时需要索引:
1.当我们经常需要查询,且列在where子句出现;
2.返回的行数,在我们总行数的%2以下,我们需要索引;
3.经常做DML操作的表不需要索引,因为表有多大索引就有多大,索引在后台需要维护,有索引在DML操作的时候,会对DML操作造成负担;
【DML操作变慢的原因:有列为我们的DML操作的数据建了索引,内存太小,内存脏数据太多,日志】
4.数据量大的表也不许要索引,否则查询数率反而慢;
二、分类:
1.B-tree :树形索引
单列索引:索引建到一个列中
组合所以/多列索引:索引以组合方式出现,多个列创建一个索引
唯一性索引:创建索引的列值是唯一的,通常唯一性索引不许要我们创建,由主键决定;
函数索引 :创建的索引的列,一以函数的形式出现;
反建索引:避免热点块的的读取
2.位图索引:经常要做查询操作,且数据量大 。查询语句中经常以all,or 连接的时候需要创建位图索引;
3.分区索引:在分区表中创建的索引,
本地索引:在分区表中,每一个分区都创建一个索引
全局索引:在分区表中,整个分区表只有一个索引
三、创建索引
1.树形索引
create index<> on tablenam(column); //单列索引
create [unqiue] index<> on tablenam(column);//唯一索引
2.位图索引
create bitmap index<> on tablenam(column);//位图索引
3.分区索引:
create index<> on tablename<为分区表的名字>(column) local ;//本地索引
create index<> on tablename<为分区表的名字>(column) global; //全局索引
单列索引 :
>>>create index ind_dept on aa(deptno) ;
>>>select * from aa where deptno=1; //从索引中寻找
#索引段中以指针方式存放着数据块在磁盘中的位置
多列索引:
>>>create index ind_dept_name on aa(deptno,dname);
>>>select * from aa where deptno=1 and dname='aa';
函数索引:
>>>create index ind_number on aa(to_number(deptno));
唯一性索引:
>>> create unqiue index<> on aa(column);
反建索引:
>>>create reverse index <> on aa<>;
位图索引:
>>>select * from emp where deptno=10 or ename='SCOTT'; //适合传建位图索引
>>>create bitmap index bmap_emp on emp(ename); //位图索引
四、查看索引
desc user_indexes
导致索引失效的原因
1.当表做了维护的操作,比如行的移动
2.分区表中有增加和减少分区
五、维护索引:
alter index <> rebuild;//索引重建,
1、用户在做DML操作,并且事务未结束,我们去重建索引会失败
2、正在重建索引,用户来做DML操作,会导致锁表,也会重建失败
所以,写成脚本,一般在业务空闲时操作大概是半夜
alter index <> unusable;//停用索引
drop index <> ; //删除索引