索引(index)
前言:大学一次考试,因为是一门考查课,平时都没怎么学习,但是却要做一张考试卷,于是大家都慌了,各自准备了自己的小抄,每个人足足有20多页(夸张手法),机智的小彪在小抄第一页写了一个目录,分别标记了,后面的知识点和页码,而傻正就蠢的一批,并没有做目录,然后考试了,在老师低头的一刹那,小彪查看目录找到了这道题的对应的页码,然后翻到这一页,然后稳一会,老师再次低头,我就开始狂抄。然而傻正就没有这么幸运了,还在拼命的一页一页翻,最后果然不出所料,哈哈哈哈哈,被老师收了小纸条,当然还是有机会考试的,毕竟是考查课。
–从以上情景故事中可以看出两个问题1.傻正同学好像不那么聪明(*委婉手法);
2.目录在我们做查询信息的时候是多么的重要。
主要是太无聊了,所以扯了以上的闲话,那么久介绍今天的主题–索引
1.说明:(1)索引在数据库中就好比我们生活中的目录,我们可以通过所以直接定位到某一行或多行数据,极大提高查询的速度。
(2)索引是独立于我们创建的表的,他可以存储在与表不同的磁盘或表空间中,是由数据库管理系统所管理的;
(3)索引被删除或者是破坏是不会影响到数据表的,只能影响到数据的查询速度;
(4)索引的使用是由数据库控制的,我们无须在查询时指定索引;
(5)删除一个表时,其对应的索引也会被相应的删除;
(6)索引通过指针直接指向数据,快速定位,减少了磁盘io;
2.索引的创建与维护
索引又分为当行索引和复合索引
(1)单行索引
单行索引是指一个索引只指向某一列;
在oracle中,我们在创建表的时候,如果该列被添加了主键约束或者唯一约束,则数据库系统会自动帮我们创建所在列的序列。无需我们手动创建;
如果我们想要在非唯一的列上创建索引则可以通过
create index 索引名 on 表名 (列名);
eg:create index user_index on users (uname);
(2)复合索引
复合索引就是同时将一个索引建立在多个列上
create index index_name on table_name (col_name1,col_name2,col_name3);
但是使用复合索引有几个注意事项,从别的博客上看到的,这里提一下:
Create Index i_deptno_job on emp(deptno,job); —>在emp表的deptno、job列建立索引。
select * from emp where deptno=66 and job=’sals’ ->走索引。
select * from emp where deptno=66 OR job=’sals’ ->将进行全表扫描。不走索引
select * from emp where deptno=66 ->走索引。
select * from emp where job=’sals’ ->进行全表扫描、不走索引。
如果在where 子句中有OR 操作符或单独引用Job 列(索引列的后面列) 则将不会走索引,将会进行全表扫描。
3.查询索引
可以使用数据字典视图 USER_INDEXES 和 USER_IND_COLUMNS 查看索引的信息
eg:
SELECT ic.index_name, ic.column_name,ic.column_position col_pos,ix.uniqueness
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name = ix.index_name
AND ic.table_name = users;
4.删除索引
DROP INDEX INDEX_NAME;
特别说明:只有索引的拥有者和拥有drop any index 权限的用户才可以删除;
5何时使用索引(索引优缺点)
想来想去还是要把这点放到最后写了,通过前面的介绍,我们对索引的使用维护基本都掌握了,现在介绍一下也是很重要的问题,我们既然说索引能提高查询效率,那么是不是任何时候我们都去创建索引呢,答案肯定是否定的(一般来说这种任何性的答案都是错的),下面简单介绍下索引使用规则。
当然了对于那些唯一性的列,系统已经帮我们创建好了,我们一般还是不会删的,这里主要考虑的还是什么时候手动创建索引。
(1)什么时候创建索引?
答:
- 当列经常出现在where子句中或者连接条件的时候;
- 列中的数据分布范围很广,比如1-1000000,一个一个遍历效率就太低了;
- 表经常被访问而且数据量很大 ,访问的数据大概占数据总量的2%到4%。
(2)什么时候不创建索引?
- 一般表比较小的时候肯定就不创建了,即表数据量很小;
- 对于表经常更新的;
- 对于并不怎么作为连接条件或者order by或where子句中出现的;
- 对于访问的数据量大于%4的;
- 以上4中不见建议创建索引的原因都是一个:首先查询肯定还是会快点,但是数据库还是需要维护索引的,在这些情况下维护一个索引的成本是非常高的。所以弊大于利,不建议使用索引。
如有问题,欢迎指出,谢谢。
本文通过一个生动的故事引入,解释了数据库索引的重要性及其工作原理。随后详细介绍了索引的创建与维护方法,包括单行索引和复合索引的区别及使用场景。此外还探讨了查询索引的方法、删除索引的操作以及何时应该使用索引等问题。
699

被折叠的 条评论
为什么被折叠?



