Oracle-索引
index:存放每一行数据在数据库表中位置的一种结构
- 加快表格查询的速度
- 有一个或者多个需要经常查询的列,但是这个列不能经常被修改
查询和删除索引
查询索引:select * from user_indexes;
删除索引:drop index 索引名;
创建索引
主键索引
- 如果有一个列是主键约束,那么这个列就自带一个主键索引
- 主键索引不能自己创建。
- 删除主键约束也会删除主键索引,两者绑定在一起
唯一索引
创建了唯一索引的列,该列的值也是不能重复的。
通过创建唯一约束创建
唯一约束也会自动的生成一个唯一索引,但是通过该方式创建的唯一索引,会跟随唯一约束的删除而被删除
单独创建唯一约束
唯一索引可以单独创建,并且创建的索引不会生成约束
create unique index 索引名 on 表名(列名);
--创建唯一索引
--通过唯一约束创建
alter table emp_idx add constraint uni_ename unique(ename);
alter table emp_idx drop constraint uni_ename;
--单独创建唯一索引
create unique index emp_ename on emp_idx(ename);
drop index emp_ename;
普通索引
最常见的类型,用在没有什么特点的列上面
create index 索引名 on 表名(列名);
--创建普通索引
create index idx_ename on emp_idx(ename);
drop index idx_ename;
组合索引
多个列需要被一起同时查询的时候,这几个列就会创建成组合索引
create index 索引名 on 表名(列名1, 列名2...);
--创建组合索引
create index idx_ename_dept_sal on emp_idx(ename,deptno,sal);
drop index idx_ename_dept_sal;
组合索引失效
上面的组合索引,其实在数据库中会生成下面几个索引:
ename,deptno,sal
ename,deptno
ename,sal
ename
如果在多条件查询的时候,没有查询第一个列,索引就没有效果
函数索引
用来需要被计算之后再查询的列
--创建函数索引
create index idx_hiredate on emp_idx(to_char(hiredate,'yyyy'));
drop index idx_hiredate;
位图索引
用在有大量重复值的固定列上面
create bitmap index 索引名 on 表名(列名);
--创建位图索引
create bitmap index bit_idx_job on emp_idx(job);
drop index bit_idx_job;
索引类型
NORMAL类型
普通类型 btree类型 b树类型
树状目录结构,包含了根节点、分支节点、叶子节点、行数据
BITMAP类型
位图索引
二维表格的目录结构,用01来保存数据的,符合条件的为1,不符合条件的为0
分区索引
在分区表上建立索引的方法
本地索引 local
在每个小分区中都有自己分区的索引目录结构
create [bitmap|unique] index 索引名 on 表名(列名) local;
全局索引 global
是在整个分区表中建一个共同的目录结构
create [bitmap|unique] index 索引名 on 表名(列名) global;
本地和全局索引它们的区别是什么?
-
创建唯一unique索引,
本地只能保证每个分区中的数据是唯一的,但是不能保证在整个表中的数据唯一性
但是全局的global可以 -
新建、删除、合并、拆分等分区的操作,全局索引会失效
索引失效
索引的失效条件(工作中要避免的部分):
- 数据类型的隐形转换
select * from emp_idx where to_char(hiredate,'yyyy')=1980;
- 数据的计算在等号的左边
select * from emp_idx where sal+150=1400
-
空值搜索
-
取反的查询
select * from emp_idx where ename!='SMITH'
select * from emp_idx where not ename='SMITH'
-
组合查询没有查询第一个列
-
函数的查询没有使用函数索引中指定计算函数
-
列的内容经常被修改
索引建立多少合适?
数量不超过列数量的15%,项目中(例如银行项目中),索引一张表不能超过5个。
怎么最快插入
如果有一个2000W数据的表格,要继续插入500W数据,怎么样达到最快的插入速度?
-
预加载:先删除表格的所有索引
-
加载:插入数据
-
收尾:重新建立所有索引