索引概念和作用

索引是建立在表上的可选对象,目的是为了提高查询速度。
如果要在表中查询指定的记录,在没有索引的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的ROWID快速找到表中对应的记录。
例如,如果将表看做一本书,索引的作用类似于书中的目录。在没有目录的情况下,要在书中查找指定的内容必须阅读全文,而有了目录之后,只需要通过目录就可以快速找到包含所需内容的页码(相当于ROWID)
 
索引的关键在于通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率。
索引在逻辑上和物理上都与相关的表的数据无关,当创建或删除一个索引时,不会影响基本的表、数据库应用或其他索引,当插入、更改和删除相关的表记录时,Oracle会自动管理所引,如果删除索引,所有的应用仍然可以继续工作。因此在表上一列或多列创建索引不会对表的使用产生任何影响,但是,可以提高检索速度。
 
索引一旦建立后,当在表上进行DML操作时,Oracle会自动维护索引,并决定何时使用索引。
索引的使用对用户是透明的,用户不需要再执行SQL语句时指定使用哪个索引以及如何使用索引。索引只与系统性能相关。

索引原理

索引的类型

可以按照列的多少、索引值是否唯一、索引数据的组织形式对索引进行分类,以满足各种表和查询条件的要求:
1、单列索引和复合索引
一个索引可以由一个或多个列组成,基于单个列所创建的索引称为单列索引,基于两列或多列所创建的索引称为多列索引。
 
2、B树索引
B树索引是Oracle中最常用的一种索引。当用 create index 语句创建索引时,默认创建的索引就是B树索引。
B树索引是按照B树结构或使用B树算法组织并存储索引数据的,B树索引就是一棵二叉树,它由根、分支节点和叶子节点三部分构成。其中,根包含指向分支节点的信息,分支节点包含指向下级分支节点和指向叶子节点的信息,叶子节点包含索引列和指向表中每个匹配行的ROWID值。叶子节点是一个双向链表,因此可以对其进行任何方面的范围扫描。

 
3、位图索引
在B树索引中,保存的是经过排序的索引即其对应的ROWID值,但是对于一些基数很小的列来说,这样做并不能显著提高查询的速度。所谓基数,是指某个列可能拥有的不重复值得个数。比如性别列的基数为2(只有男和女)
因此,对于像性别、婚姻状况、政治面貌等只有几个固定值的字段而言,如果要建立索引,应该建立位图索引,而不是默认的B树索引。

4、函数索引
Oracle还可以对包含有列的函数或表达式创建索引,这就是函数索引。
当需要经常访问一些函数或表达式时,可以将其存储在索引中,当下次访问时,由于该值已经计算出来了,因此,可以大大提高那些在 where 字句中包含该函数或表达式的查询操作的速度。

管理索引的原则

创建索引

创建索引使用create index语句

可以在一个表上创建多个索引,但这些索引的列的组合必须不同,如下:

create index idx1 on sales(id,topic);
create index idx2 on sales(topic,id);
其中,idx1和idx2索引都使用了id和topic列,但由于顺序不同,因此是合法的。
 
创建B树索引
B树索引是Oracle默认的索引类型,例如在 sales 表的 topic 列上按标题查询,可以在 topic 列上建立B树索引
create index idx_name on sales(topic); 单列索引
CREATE INDEX idx_name ON sales(job,sal); 复合索引
 
 
创建位图索引
以sales表的islook列(基数为2,只有2个值,Y或N)创建位图索引
create bitmap index idx_name on sales(islook);
(其实创建了索引并不一定就会使用,Oracle在自动搜集了表和索引的统计信息后,会决定是否使用索引,如果表数据太少,就可以直接全表扫描,不必使用索引)
 
创建函数索引

CREATE INDEX idx_name ON sales(UPPER(topic));
 
重命名索引
alter index idx_name1 rename to idx_name2;
删除索引

drop index idx_name;
重建索引
alter index idx_name rebuild;
合并索引
alter index idx_name coalesce;
 
查询索引
用user_indexes和user_ind_columns系统表查看已经存在的索引
user_indexes: 系统视图存放是索引的名称以及该索引是否是唯一索引等信息。
user_ind_column: 系统视图存放的是索引名称,对应的表和列等。
基本查询:
select * from user_indexes;
select * from user_ind_columns;
关联查询:
select i.index_name, i.index_type, i.table_owner, i.table_name, i.uniqueness, i.tablespace_name, c.column_name, c.column_position, c.column_length from user_indexes i, user_ind_columns c where i.index_name = c.index_name; 也可以用all_indexes表查询
select index_name,index_type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';
以上内容来自慕课网的相关教程

SQL查询--索引的更多相关文章

  1. SQL Server索引视图以(物化视图)及索引视图与查询重写

    本位出处:http://www.cnblogs.com/wy123/p/6041122.html 经常听Oracle的同学说起来物化视图,物化视图的作用之一就是可以实现查询重写,听起来有一种高大上的感 ...

  2. 索引 使用use index优化sql查询

    好博客:MySQL http://webnoties.blog.163.com/blog/#m=0&t=1&c=fks_08407108108708107008508508609508 ...

  3. sql查询调优之where条件排序字段以及limit使用索引的奥秘

       奇怪的慢sql 我们先来看2条sql 第一条: select * from acct_trans_log WHERE  acct_id = 1000000000009000757 order b ...

  4. 【转】同一个SQL查询语句,为什么使用到的索引不同?

    问: 同一个SQL查询语句,只是修改where条件中的一个值,为什么使用到的索引情况也会不同?谢谢! 1) explain执行结果,如下图: 2) 表中的数据如下图: 3) 表结构如下图: 4) 创建 ...

  5. sql查询未走索引问题分析之查询数据量过大

    前因: 客户咨询,有一个业务sql(代表经常被执行且重要),全表扫描在系统占用资源很高(通过ash报告查询得到信息) 思路: 1.找到sql_text,sql_id 2.查看执行计划 3.查询sql涉 ...

  6. MySQL 基本语法(1.表字段操作,2表记录管理 3.运算符管理4.SQL查询 5.约束6.索引

    .表字段的操作 .语法:alter table 表名 执行动作; .添加字段(add) .添加到末尾 alter table 表名 add 字段名 数据类型; .添加到第一列 alter table ...

  7. SQL常见优化Sql查询性能的方法有哪些?

    常见优化Sql查询性能的方法有哪些? 1.查询条件减少使用函数,避免全表扫描 2.减少不必要的表连接 3.有些数据操作的业务逻辑可以放到应用层进行实现 4.可以使用with as 5.使用“临时表”暂 ...

  8. Oracle常用SQL查询(2)

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

  9. Thinkphp查询 1.查询方式 2.表达式查询 3.快捷查询 4.区间查询 5.组合查询 6.统计查询 7.动态查询 8.SQL 查询

    1.使用字符串作为条件查询 $user = M('User'); var_dump($user->where('id=1 AND user="蜡笔小新"')->sele ...

随机推荐

  1. seaborn画出的一些好看的图片

    PYSPARK_DRIVER_PYTHON=/home/zhangyu/anaconda3/bin/jupyter-notebook PYSPARK_DRIVER_PYTHON_OPTS=" ...

  2. VueUI -- iView4.0简单使用

    一.iView(View UI) 1.简介 官网:https://www.iviewui.com/ 仓库:https://github.com/view-design/ViewUI iView 与 V ...

  3. 在Electron中最快速预加载脚本

    背景 在Electron打开新窗口的时候,提前加载一段JavaScript脚本,以此内置一些属性或接口给被打开的页面.之所以要以注入方式,而不是页面自己引用,原因是不想麻烦页面自行引用,不想修改旧有的 ...

  4. [document.cookie]为什么cookie不在window下的呢.奇怪了[未完待续]

    什么是cookie,怎么就叫cookis,它能干嘛 我猜吧,就是登录页面的时候传值,二次登录的时候可以给你说句'hello xxx'; 下面这堆比较啰嗦,随意看吧 //cookie 用户储存在用户本地 ...

  5. JS---DOM---总结获取元素的方式

    总结获取元素的方式 1. 根据id属性的值获取元素,返回来的是一个元素对象 document.getElementById("id属性的值"); document.getEleme ...

  6. C语言编程的一些小总结

    1. static:可用于定义静态局部变量 在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量. 举一个静态局部变量的例子: void fn() { static int n=1 ...

  7. jQuery - 拦截所有Ajax请求(统一处理超时、返回结果、错误状态码 )

    样例代码: <html> <head> <title>hangge.com</title> <meta charset="utf-8&q ...

  8. packstack-ironic

    安装openstack Pike版本, 其它版本安装方法类似. centos7.6 packstack目前对NetworkManager 还不支持,我们修改下配置: systemctl disable ...

  9. 如何在Oracle 12C中Drop/Truncate多个分区 (Doc ID 1482264.1)

    How to Drop/Truncate Multiple Partitions in Oracle 12C (Doc ID 1482264.1) APPLIES TO: Oracle Databas ...

  10. celery执行异步任务和定时任务

    一.什么是Clelery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组成,消息中间件 ...