数据库的索引:index
什么是索引:就是每一个表格的目录结构,帮你快速的定位表格中的数据在表格里的位置
添加索引的语法:
create index 索引名 on 表名(列名);
索引有哪些类型:
1. 主键索引:在创建表格的时候,添加了主键约束,那么就会自动生成主键索引
alter table emp_idx add constraint pri_empno primary key(empno);
通过主键约束的创建,来生成这个主键索引
2. 唯一索引:
2.1 在创建表格的时候,会根据唯一约束自动的生成唯一索引
alter table emp_idx add constraint uni_empno unique(empno);
2.2 在没有约束的前提下,手动创建唯一索引,唯一索引不会反过去创建唯一约束
create unique index idx_emp_empno on emp_idx(empno);
3. 普通索引:这个列经常需要被查询,但是这个列又没有什么特点
create index idx_nor_ename on emp_idx(ename);
4. 组合索引:和普通索引相同,有多个列需要同时被查询,但是这些列也没有什么特点,那么就放在一起,创建一个组合索引
create index idx_sal_job on emp_idx(sal,job);
create index 索引名 on 表名(a,b,c);
abc
ab
ac
a
查询组合索引,一定需要包含组合的第一个列
5. 函数索引:如果你的列,是需要被使用函数计算之后再用来查询,那么计算过程需要被写在索引里面
create index idx_func_hiredate on emp_idx(to_char(hiredate,‘yyyy’));
6. 位图索引:列的内容是由大量的重复的内容组成的 bitmap
create bitmap index idx_emp_deptno on emp_idx(deptno);
- 分区表索引
7.1 本地索引
create index idx_hash_ename on emp_hash(ename) local;
7.2 全局索引
create index idx_hash_job on emp_hash(job) global;
本地和全局的区别?
–本地索引的话,在创建唯一索引的时候,在整个表中,可能会出现重复信息,在一个分区里面,值保证是唯一的,全局索引是整个表中,数据唯一存在
–删除了一个分区或者新增了一个分区,那么全局的索引会失效,需要你删除了索引然后重新建立,本地的索引是不会失效的
删除索引:
drop index 索引名;
drop index idx_hash_job;
什么时候用哪种索引
普通的索引和位图的索引,区别在哪?
主键、唯一、普通、组合、函数(普通的normal类型) 树状结构 b树索引,btree索引
位图(bitmap) 二维表结构
普通索引是通过根节点、分支节点、叶子节点、行数据四个节点块,一层层进行数据范围的筛选。
位图的索引是在二维表中,通过0和1来存储数据内容。
每一种索引都是通过rowid来搜索数据的。
索引是不是越多越好?
一个表不要建超过5个索引;索引的数量,不要超过列的数量的15%。
索引一定是建立上反复的经常被查询的列上。
索引会加快dql的速度,但是会降低dml的速度。
有一个2000W数据的表格,要接着往里面添加2000W的数据,怎么样操作最快?
1.先删除所有的索引
2.插入2000W数据
3.重建索引
索引在什么时候会失效?
- 经常需要被修改的列,索引是一直处于失效状态的
- 数据发生了隐性的转换
select * from emp_idx where to_char(hiredate,‘yyyy’)=1981; - 计算的时候,公式放在了等号的左边
select * from emp_idx where sal+1000=4000 and job=‘MANAGER’ - 查询的时候使用不等于
select * from emp_idx where deptno!=20 - 查询的时候使用了not
select * from emp_idx where not deptno=20 - 空值查询
select * from emp_idx where ename is null - 组合索引没有使用第一列的列查询
- 查询的时候,使用了非函数索引的函数
什么是索引?
索引有哪些类型?分别在什么时候会使用到不同的索引?
索引是不是越多越好?
大量数据的表格插入,怎么操作会更快?
索引在什么时候会失效?