索引概念和作用

索引是建立在表上的可选对象,目的是为了提高查询速度。
如果要在表中查询指定的记录,在没有索引的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的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. RESTful 架构风格

    在移动互联网的大潮下,『微服务』的概念也越来越被大家接受并应用于实践,日益增多的web service逐渐统一于RESTful 架构风格,如果开发者对RESTful 架构风格不甚了解,则开发出的所谓R ...

  2. MySQL 主从复制问题

    导致SQL线程故障原因分析及解决方案 原因 1. 版本差异,参数设定不同,比如:数据类型的差异,SQL_MODE影响 2. 要创建的数据库对象已经存在 3. 要删除或修改的对象不存在 4. DML语句 ...

  3. 计算机网络知识之TCP/IP协议簇

    OSI参考模型 OSI的来源         OSI(Open System Interconnect),即开放式系统互联. 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网 ...

  4. SpringBoot系列之@PropertySource读取yaml文件

    SpringBoot系列之@PropertySource支持yaml文件读取 最近在做实验,想通过@PropertySource注解读取配置文件的属性,进行映射,习惯上用properties都是测试没 ...

  5. Linux系统:centos7下搭建ElasticSearch中间件,常用接口演示

    本文源码:GitHub·点这里 || GitEE·点这里 一.中间件简介 1.基础概念 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于R ...

  6. 【已解决】前端到后端400错误(The server cannot or will not process the request due to...)

    看到400错误,一般是请求无效.出现该异常一般有三种情况: 第一种情况: 前端提交的内容在后端一般都用String类型来接收,用Date类型接收会报错. 第二种情况: 在提交表单的时候,填写的数据类型 ...

  7. PHP bcpow BC数学函数

    定义和用法 bcpow - 任意精度数字的乘方 版本支持 PHP4 PHP5 PHP7 支持 支持 支持 语法 bcpow( string $left_operand , string $right_ ...

  8. 关于mybtis 使用过程中发生There is no getter for property named 'id' in class 'java.lang.String' 错误

    今天在修改一个关于mybtis语句时,偶然发现的一个错误  There is no getter for property named 'id' in class 'java.lang.String' ...

  9. 对cookie-parser的理解(签名、加密)

    1.为什么说要利用签名防止cookie被恶意篡改 我们在浏览器输入用户名和密码发送post请求到后端服务器,后端服务器验证合法,返回响应,并Set-Cookie为sessionid=***;usern ...

  10. 【C#】学习笔记 Linq相关

    Language-Integrated Query(语言集成查询) 写了个demo,具体看