网络上,对于索引有很多总结:
索引是一种数据库对象;
索引就像是书本的目录,可以实现快速检索查找目标数据;
提高SQL语句的查询性能;
减少磁盘I/O;
在逻辑上和物理上独立于表数据;
索引的类型包括唯一索引、位图索引、组合索引、基于函数的索引、反向索引、B树索引。。。。等。
B树索引,是默认的索引类型,除非有特殊需求,否则正常的B树索引即可。
唯一索引,B树索引的另一种形式,用于强制列值的唯一。通常与主键、唯一约束一块使用,但也可独立。
。。。等等的,就这么多吧。
但是,怎么用,在下面小总一下下。
1.先说说索引相关的视图
user_indexes/all_indexes/dba_indexes ...谁能用这三个货?当然是谁权力大,谁用的多了。我是DBA所以,我谁都能使唤。
一般来说,就查查 dba_indexes ,看看它里面都有啥。比如,我这样查:
select * from dba_indexes where owner = 'baoyw' and table_name = 'TABLE_NAME';
all_ind_columns 这个是表的索引有哪些零件?!这些零件包括,你的索引是创建在哪些字段上的,有几个字段,字段的顺序是什么。。。然后,对比你的执行计划,看看它有没有走这个索引。
select * from all_ind_columns where index_name = 'IDX_BAOYW_ID' ;
那如果你想看看,索引是怎么个创建的,可以这么做:
select dbms_metadata.get_ddl('INDEX','IDX_BAOYW_ID','BAOYW');
--好吧,全面的长这样,是不是很复杂,但语法就是这样
create index "baoyw"."idx_baoyw_name" on "baoyw"."baoyw240305"("name")
pctfree 10 initrans 2 maxtrans 255 compute statistics
storage(initial 65536 next 1048576 minextents 1 maxextents 2147483645
pctincrease 0 freelists 1 freelist groups 1
buffer_pool default flash_cache default cell_flash_cache default)
tablespace "baoyw";
这里查看到的创建语句是全面的,你自个对比就知道了。因为我们通常的创建语句写的很简单。
create index baoyw.idx_baoyw_name on baoyw.baoyw("name");
2.再来说说索引的创建
创建其实很简单,一条语句足矣。但问题是,你要在哪个基础哪个需求上,创建。也就是说,哪里需要,你就要让它在哪里出现。
假如,你查询表 baoyw 时,要搜索某个 name 的数据,你要怎么做?
--这样吗?你能找到你想要的 name 吗?海底捞啊!你以为在吃火锅。
select * from baoyw;
--加个条件 name 是不是一眼万年的感觉
select * from baoy where name = 'XXX';
单列索引
--假如,baoyw 这张表,有几十亿上百亿条数据呢,你怎么找?给它整个目录呗!
create index baoyw.idx_baoyw_name on baoyw.baoyw("name");
--再查询,嘎嘎快
select * from baoyw where name = 'XXX';
复合索引(组合索引)
--假如,你要更精确的,多条件的在 几十亿上百亿条数据的表 baoyw 中查询一条或几条数据呢
select * from baoyw where id = 'xzx' and name = 'XXX';
--那就一起来吧
create index baoyw.idx_baoyw_id_name on baoyw.baoyw("id","name");
唯一索引
--假如,baoyw 这张表,name 字段上的值都是唯一的,不重复的,就可以创建唯一索引
create unique index baoyw.idx_baoyw_name on baoyw.baoyw("name");
3.删除一个索引
drop index baoyw.idx_baoyw_id_name;
4.重建索引
重建索引一般要业务非繁忙阶段操作;重建索引后,记得收集统计信息。
alter index baoyw.idx_baoyw_id_name rebuild;
在实际的生产实践中,要结合实际情况操作。所以,需要考虑的方面,不只是索引,有表的大小、相关约束、业务繁忙程度等。