本文参考:

https://www.cnblogs.com/wishyouhappy/p/3681771.html

https://blog.csdn.net/weivi001/article/details/45498405

索引简介

• 索引(index)是数据库对象的一种。索引的关键在于通过一组排序后的物理地址作为键来取代默认的全表扫描检索方式,就像为书本添加目录,通过牺牲物理内存的方式提高数据的检索效率。

• 它对用户时透明的,它的创建不会影响对表的sql操作。索引一旦建立,在表上进行DML操作时(例如在执行插入、修改或者删除相关操作时),oracle会自动管理索引。

• oracle创建主键时会自动创建索引

添加索引

1.创建默认索引

CREATE UNIQUE INDEX (索引名称) ON 表名 (列名1,列名2...) ;   --unique(默认)表示唯一索引

2.修改索引

alter index (旧索引名称) rename to(新索引名称);

3.删除索引

drop index (索引名称);

4.查看索引

查看某表的所有索引:

select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name =(表名);

常用的2种索引及适用场景

1.b树索引(默认索引,保存排序过的索引列和对应的rowid值)

b树索引是oracle最常见的的索引,它的原理是利用了b-树的数据结构(b树的原理:https://blog.csdn.net/baidu_30569267/article/details/80983295

b树索引结构图:

b树的所有叶子节点拥有相同的深度,oracle将索引列和对应的rowid值存入叶子节点上,因此所有的检索速度基本都是相同的。

b树索引的不适用场景:

不适合键值较少的列(重复数据较多的列)

假如索引列TYPE有5个键值,如果有1万条数据,那么 WHERE TYPE = 1将访问表中的2000个数据块。再加上访问索引块,一共要访问大于200个的数据块。

如果全表扫描,假设10条数据一个数据块,那么只需访问1000个数据块,既然全表扫描访问的数据块少一点,肯定不会利用b树索引了。

(不过,事实上,当取出的行数据占用表中大部分的数据时,即使添加了B树索引,数据库如oracle、mysql也不会使用B树索引,很有可能还是一行行全部扫描)

2.位图索引(bit-map index)

位图索引是对列的每个键值设置一个位图。
 
比如有这样一列a:
 
 10    20    30    20    10    30    10    30    20    30
 
那么会建立三个位图,如下:
 
KEY=10  1    0    0    0    1    0    1    0    0    0   
KEY=20  0    1    0    1    1    0    0    0    1    0 
KEY=30  0    0    1    0    0    1    0    1    0    1

这适合于该列的基数非常小的情况,当建立位图索引时,会为每个独立的值建立向量,比如上面3个,就会建立3个向量:key=10: 1000101000,key=20: 0101100010...

如果再有一列b:

x y x x y y y x y

key = x : 1 0 1 1 0 0 0 1 0

key = y : 0 1 0 0 1 1 1 0 1

如果你对a列和b列使用 and 或者 or操作,这里就会体现位图索引使用bit的优势:比如 "a=10 and b =x " :它会将 key=10 :100010100向量 和  b=x :101100010向量进行与操作,更快的取出索引对应的行

适用场景:

和B树索引相反,位图索引适合键值重复率高的表,若重复值很低,则位图索引相对的会需要大量数据。由于位图索引采用0,1记录某行是否包含该键值,因此非常适合AND, OR, NOT,count等这样的逻辑操作。
位图索引非常不适合有大量“写”的操作,因为每一个位图键值中,都可能对于多条记录,当修改一条记录更新位图键值时,会在对应的位图索引键上加锁,从而导致对其它记录的修改也会被阻塞。

什么情况下需要建立索引

1. 如果有两个或者以上的索引,其中有一个唯一性索引,而其他是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引

2. 至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引),因此最常查询的列应该放在前面

3.小表不需要建立索引

4.列中有很多空值,但经常查询该列上非空记录时应该建立索引

5.经常进行连接查询的列应该创建索引

6. LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引

7.通常来说,表的索引越多,其查询的速度也就越快。但是,表的更新速度则会降低。这主要是因为,在更新记录的同时需要更新相关的索引信息。为此,需要在这个更新速度与查询速度之间取得一个均衡点。同时过多的索引会增加物理内存,数据库管理员需要定期去优化索引。

sql中无法使用索引的情况

1.通配符在搜索词首出现时不能用索引:

--下面的方式oracle不适用name索引

select * from student where name like '%wish%';

--如果通配符出现在字符串的其他位置时,优化器能够利用索引;如下:

select * from student where name like 'wish%';

2.不要在查询条件中使用not:

select * from student where not (score=100);

select * from student where score <> 100;

--替换为

select * from student where score>100 or score <100

3. b树索引上使用空值比较将停止使用索引,Oracle的索引不保存全部为空的行:

select * from student where score is not null;

select * from student where score is null;

有一个可以变通的方法,即我们在创建表的时候,为每个列都指定为非空约束(NOT NULL),并且在必要的列上使用default值

												





											

oracle 常用索引分析,使用原则和注意事项的更多相关文章

  1. 索引优化原则及Oracle中索引总结

    索引建立原则 确定针对该表的操作是大量的查询操作还是大量的增删改操作. 尝试建立索引来帮助特定的查询.检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引. where语句中不得不对查 ...

  2. Oracle创建索引的原则(转)

    Oracle 建立索引及SQL优化 数据库索引: 索引有单列索引复合索引之说 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引.数据库索引主要进行提高访问 ...

  3. Oracle常用命令大全(很有用,做笔记)

    一.ORACLE的启动和关闭 1.在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a.启动ORACLE系统 oracle>svrmgrl ...

  4. Oracle常用语法

    Oracle常用语句语法汇总 Oracle10g 1 第一章Oracle命令 a) 系统管理员连接 conn */* as sysdba b) 查询当前用户 show user c) 创建新用户 cr ...

  5. Oracle常用SQL查询(2)

    三.查看数据库的SQL 1 .查看表空间的名称及大小 select  t.tablespace_name,  round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...

  6. Oracle常用语句集合

    oracle常用经典SQL查询 常用SQL查询: .查看表空间的名称及大小 )),) ts_size from dba_tablespaces t, dba_data_files d where t. ...

  7. oracle常用命令(比较常见好用)

    一.ORACLE的启动和关闭 1.在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle  a.启动ORACLE系统 oracle>svrmgr ...

  8. oracle 常用语法

    一.ORACLE的启动和关闭1.在单机环境下要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下su - oraclea.启动ORACLE系统oracle>svrmgrlSVRMG ...

  9. ORACLE 常用SQL查询

    一.ORACLE的启动和关闭 1 .在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su  -  oracle a.启动ORACLE系统 oracle > sv ...

随机推荐

  1. WPF自定义RoutedEvent事件代码段

    今天在写东西的时候,发现常用的代码段里没有RoutedEvent的,因此,写了一个代码段,方便以后使用,顺便记录一下,如何做代码段. 1.在项目中新建一个XML文件,将扩展名修改为snippet. 2 ...

  2. PHP基础班初学心得:关于网页创作

    前提:本人刚参加PHP基础班培训第一天,由于之前毫无基础,分享的心得可能不规范,方法也许也"旁门左道",不能保证质量,只作自己总结学习,也希望能帮助到同样是初学者的朋友们,共同进步 ...

  3. zoj1665 dij变形

    既然输入的是损坏率,那1-x就是剩余的.最后只要剩余的最大. #include<stdio.h> #include<string.h> #define Max 99999999 ...

  4. KVO 其原理探究

    什么是KVO ? KVO这是Key-Value Observing,它提供了一种机制,指定的对象的属性被改动后,则对象就会接受到通知. 简单的说就是每次指定的被观察的对象的属性被改动后.KVO就会自己 ...

  5. linux之shell编程基本语法

    Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell.Shell也是一门编程语言<解释型的编程语言>,即shell脚本<就是在用linux的s ...

  6. LeetCode1-5题

    1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...

  7. CentOS7编译安装mysql-5.6.43

    Step 1:安装编译需要的软件和工具 [root@node-1 ~]# yum install gcc gcc-c++ cmake ncurses-devel bison Step 2:创建mysq ...

  8. 21.QT-QTreeWidget,QTabWidget

    QTreeWidget树形列表 设置标签相关函数 void QTreeWidget::setHeaderItem (QTreeWidgetItem * item ); void QTreeWidget ...

  9. DIY一些基于netty的开源框架

    几款基于netty的开源框架,有益于对netty的理解和学习! 基于netty的http server框架 https://github.com/TogetherOS/cicada 基于netty的即 ...

  10. var_dump出现省略号的问题

    xdebug.var_display_max_children=128xdebug.var_display_max_data=512xdebug.var_display_max_depth=5