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;

本地和全局索引它们的区别是什么?

  1. 创建唯一unique索引,
    本地只能保证每个分区中的数据是唯一的,但是不能保证在整个表中的数据唯一性
    但是全局的global可以

  2. 新建、删除、合并、拆分等分区的操作,全局索引会失效

索引失效

索引的失效条件(工作中要避免的部分):

  1. 数据类型的隐形转换
select * from emp_idx where to_char(hiredate,'yyyy')=1980;
  1. 数据的计算在等号的左边
select * from emp_idx where sal+150=1400
  1. 空值搜索

  2. 取反的查询

select * from emp_idx where ename!='SMITH'

select * from emp_idx where not ename='SMITH'
  1. 组合查询没有查询第一个列

  2. 函数的查询没有使用函数索引中指定计算函数

  3. 列的内容经常被修改

索引建立多少合适?

数量不超过列数量的15%,项目中(例如银行项目中),索引一张表不能超过5个。

怎么最快插入

如果有一个2000W数据的表格,要继续插入500W数据,怎么样达到最快的插入速度?

  1. 预加载:先删除表格的所有索引

  2. 加载:插入数据

  3. 收尾:重新建立所有索引

posted @ 2020-10-07 19:52  Hedger_Lee  阅读(189)  评论(0编辑  收藏  举报