索引学习(一)

在海量信息发展的今天,如何快速的查找和定位到我们需要的数据成为一种挑战,而数据库索引也是这一挑战中最为基础的元素。

索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

1.  索引的类型

  B-树索引   

  位图索引  
  HASH索引    
  索引编排表

  反转键索引
  基于函数的索引 
  分区索引  

  本地和全局索引

2.
索引优点:

2.1  通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

2.2  可以大大提高数据的检索速度,这也是创建索引的最主要的原因。

2.3  可以提高表和表之间的连接速度,特别是在实现数据的参考完整性方面特别有意义。

2.4  在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

2.5  通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

3.
索引的缺点:

3.1  创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

3.2  索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

3.3  当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

4.
应该建索引列的特点:


4.1  在经常需要搜索的列上,可以加快搜索的速度;

4.2  在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;

4.3  在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;

4.4  在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

4.5  在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

4.6  在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

5.
不宜建立索引的特性:

 
5.1  对于那些在查询中很少使用或者参考的列不应该创建索引。
     
  这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。
     
  相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。

5.2  对于那些只有很少数据值的列也不应该增加索引。
    
  这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,
    
  即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。

5.3  对于那些定义为blob数据类型的列不应该增加索引。
     
  这是因为,这些列的数据量要么相当大,要么取值很少。

5.3  当修改性能远远大于检索性能时,不应该创建索引。
    
  这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。
    
  当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

5.4  含有Null值的列,不应该建立索引。
  
 

    
    
6.
限制索引(索引失效)的因素有:

6.1  使用不等于操作符(<>、!=)
  
     
下面的查询即使在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。
        
select cust_Id,cust_name from customers where  cust_rating <>
‘aa‘;     
 

      
把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的优化器(更智能)时,将会使用索引。     
 
       select cust_Id,cust_name from
customers where cust_rating < ‘aa‘ or cust_rating >
‘aa‘;

  
特别注意:通过把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描。
 
6.2   使用IS NULL 或IS NOT
NULL
        使用IS NULL 或IS NOT
NULL同样会限制索引的使用,因为NULL值并没有被定义。
      
 在SQL语句中使用NULL会有很多的麻烦。因此建议开发人员在建表时,把需要索引的列设成NOT NULL。
  
   
 如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引,关于位图索引在稍后在详细讨论)。
  
 
6.3   使用函数
       
  如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。
  
       下面的查询不会使用索引(只要它不是基于函数的索引)
  
     
        select
empno,ename,deptno from emp  where 
trunc(hiredate)=‘01-MAY-81‘;

       
把上面的语句改成下面的语句,这样就可以通过索引进行查找。
       
select empno,ename,deptno from emp where 
hiredate<(to_date(‘01-MAY-81‘)+0.9999);
    
6.4  
比较不匹配的数据类型
         也是比较难于发现的性能问题之一,
注意下面查询的例子,account_number是一个VARCHAR2类型,在account_number字段上有索引。

  
     下面的语句将执行全表扫描:
      
 select bank_name,address,city,state,zip from banks where account_number =
990354;
      
 Oracle可以自动把where子句变成to_number(account_number)=990354,这样就限制了索引的使用,改成下面的查询就可以使用索引:
  
     select bank_name,address,city,state,zip from banks
where account_number =‘990354‘;
 
      
 特别注意:不匹配的数据类型之间比较会让Oracle自动限制索引的使用, 即便对这个查询执行Explain
Plan也不能让您明白为什么做了一次“全表扫描”
        
6.5  
对索引列进行运算
        
使用函数,类型不匹配,对索引列进行各类运算,都会导致索引失效。
      
 
6.6   当使用LIKE关键字时,LIKE ‘%——’ 百分号在前面的,索引也会失效
  
 

7. 
选用适合的Oracle优化器


    1. 
Oracle的优化器共有3种:
        a. RULE (基于规则)

        b. COST (基于成本)
  
     c. CHOOSE (选择性)。    
  
     
      
 
        
  
     
本文参考以下内容:
http://www.2cto.com/database/201110/107271.html

时间: 2024-10-17 02:07:45

索引学习(一)的相关文章

索引学习 查找 数据结构 梳理

索引是啥? 索引是数据结构,在数据结构有一章叫查找,在国外的一本书上名字就找索引. 准确的说就是: 加快查找的数据结构. 查找的那一章: 1.有序数组的二分查找 2.二叉查找 ,在此处,为了效率防止退化,引入了平衡的调整. 3.在上述的平衡的定义,为左右高度至多差1,要求太严,调整频露高,于是红黑树应运而生,它对平衡的定义要求最长的比最短的最多2倍,降低平衡要求的目的是提高性能. 红黑树的5条性质如下: 1.节点为黑或红. 2.根和叶子为黑. 3.不能出现红红. 4,每个节点到叶子黑色高度相同.

MongoDB数据模型和索引学习总结

MongoDB数据模型和索引学习总结 1. MongoDB数据模型: MongoDB数据存储结构: MongoDB针对文档(大文件採用GridFS协议)採用BSON(binary json,採用二进制编码)数据格式来存储和交换数据.Bson吸收了JSON schema-less的特点,存储结构松散,不须要像RDB(关系数据)那样事先定义数据存储的元数据结构.另外添加了多种数据类型的支持和优化,使读写更加高效. (1) BSON 支持的数据类型: Double.String.Object.Arra

mongodb之索引学习

学习索引分类和创建索引:                1._id索引 大多数集合默认的索引2.单键索引:手动创建,一个单一的值3.多建索引:组合函数4.复合索引 :最左前缀原则5.过期索引 :一定时间内失效,注意点:必须是isodate或者其数组,不要使用时间戳,否则不会被自动删除.6.全文索引 db.tm.ensureindex({"article":"text"}),db.tm.ensureindex({"key1":"text&

SQL索引学习-索引结构

前一阵无意中和同事讨论过一个SQL相关的题(通过一个小问题来学习SQL关联查询),很惭愧一个非常简单的问题由于种种原因居然没有回答正确,数据库知识方面我算不上技术好,谈起SQL知识的学习我得益于2008年进的一家公司,有几个DBA技术相当专业,正好手上有一个项目遇到了一些数据库查询性能问题,就试着想办法优化,于是自己将相法和DBA沟通后,居然得到了他们的赞同,让我信心大增,后来一段时间我又主动找他们聊了一些其它的知识,所以在数据库索引这块我算是相对一般的.net程序员要更加有见解一些.当时我们部

数据库索引学习

一.索引介绍 数据库索引调优是一项技术活,不能仅仅靠理论,因为实际情况千变万化,而且各种数据库本身存在很复杂的机制,如查询优化策略和各种引擎的实现等.但同时这些理论是索引调优的基础,只有在明白理论的基础上,才能对调优策略进行合理推断并了解其背后的机制,然后结合实践中不断的实验和摸索. 索引其实就是在数据库存储数据之外,还维护着另外的满足某种查询算法的数据结构,这些数据结构再以某种方式指向真实的存储数据,然后在现有的数据结构上实现快速查询.(找了张很不错的二叉树的图来理解索引,现在大多的索引都是B

B tree索引学习总结

b tree索引 索引的结构: 1.创建一个测试表 create table it (x number ,y varchar2(100)); 2.插入一万行数据 begin for i in 1..100000 loop insert into it values(i,rpad(i,100,'*')); end loop; end; / 3.创建索引在x列上 create index idx_it on it(x); 4.收集表信息 SQL> exec dbms_stats.gather_tab

oracle索引学习

查看执行状态: 选中代码直接按F5,或者点击Tools===>>Explain Plan 一.索引的注意事项: 当任何单个查询要检索的行少于或者等于整个表行数的10%时,索引就非常有用.这就意味着索引的候选列应该是用来存储很大范围的值的列. 好的索引侯选列就是那些对每一个记录只包含一个唯一数字的列:差的索引候选列是那些只包含很小范围的数字代码的列. 二.创建索引 create [unique] index index_name on table_name(colum_name[,colum_n

小贝_mysql索引学习与优化

mysql索引与优化 简要: 一.索引是什么 二.索引类型及使用语法 三.全文索引说明 一.索引是什么 1.以书的目录为例,通过查看目录,再找到对应的内容.因此,索引就是给数据加上了'目录',便于快速找到数据 2.索引的作用: 好处: 加快了查询速度 坏处: a.降低了增删改的速度 b.增大了表的文件大小(索引文件甚至可能比数据文件还大) 案例: 设有某个表15列,存在10列上有索引,共500w行数据,如何快速导入? 答: 1.把空表的索引全部删除 2.导入数据 3.数据导入完毕后再建立索引 3

mysql 多列索引学习-经典实例

索引优化 ,b-tree假设某个表有一个联合索引(c1,c2,c3,c4) 以下 只能使用该联合索引的c1,c2,c3部分A. where c1 = x and c2 = x and c4>x and c3 = xB. where c1 = x and c2 = x and c4=x order by c3C. where c1 = x and c4 = x group by c3,c2D. where c1 = ? and c5 = ? order by c2,c3E. where c1 =

mysql索引学习

索引用于快速找出在某列中有一特定值的行. 如果不实用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行. 表越大,查询数据所花费的时间越多. 如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻数据文件,而不必查看所有的数据. 内容导航 了解什么是索引 掌握创建索引的方法和技巧 熟悉如何删除索引 掌握综合案例中索引创建的方法和技巧 熟悉操作索引常见的问题 索引简介 索引是对数据库表中一列货多列的值进行排序的一种结构,使用索引可提高数据库中特定数据的查询速度. 索引的含义和