什么是索引 以及索引失效的原因

文章详细介绍了数据库索引的概念和类型,包括主键索引、唯一索引、普通索引、组合索引、函数索引和位图索引,以及它们的创建和删除方法。强调了不同索引的适用场景,指出索引并非越多越好,应根据查询需求合理创建。对于大量数据插入,建议先删除索引,插入后再重建。同时,文章列举了导致索引失效的情况,如列的频繁修改、使用不匹配的查询条件等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库的索引: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);

  1. 分区表索引
    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.重建索引

索引在什么时候会失效?

  1. 经常需要被修改的列,索引是一直处于失效状态的
  2. 数据发生了隐性的转换
    select * from emp_idx where to_char(hiredate,‘yyyy’)=1981;
  3. 计算的时候,公式放在了等号的左边
    select * from emp_idx where sal+1000=4000 and job=‘MANAGER’
  4. 查询的时候使用不等于
    select * from emp_idx where deptno!=20
  5. 查询的时候使用了not
    select * from emp_idx where not deptno=20
  6. 空值查询
    select * from emp_idx where ename is null
  7. 组合索引没有使用第一列的列查询
  8. 查询的时候,使用了非函数索引的函数

什么是索引?
索引有哪些类型?分别在什么时候会使用到不同的索引?
索引是不是越多越好?
大量数据的表格插入,怎么操作会更快?
索引在什么时候会失效?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一凡888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值