如题,现在还被索引的概念搞混了,理解不了。我就举个例子,假设有表student,有1W条数据。
如果没有建立列id索引,查询如下:
select name ,age from student where id<5000;
系统执行这个语句的时候,是不是就会先搜索完整个表里的数据,然后返回满足条件的记录?如果加了索引:
create index my_index on student(id);
然后再查询上面语句:
select name ,age from student where id<5000;
系统是不是执行这句的时候,会先直接通过索引定位到id为5000的记录上,然后做后续的工作?前面这个问题估计有些弱智,但是确实糊涂了?还有看资料的时候,好多情况下索引是不能够起作用,这又是为什么,内在的原理是什么?
麻烦懂得大神解释下啊
在线等.........Oracle索引sql优化

解决方案 »

  1.   

    数据库中索引(Index)的概念与目录的概念非常类似。如果某列出现在查询的条件中,而该列的数据是无序的,查询时只能从第一行开始一行一行的匹配。创建索引就是对某些特定列中的数据排序,生成独立的索引表。在某列上创建索引后,如果该列出现在查询条件中,Oracle会自动的引用该索引,先从索引表中查询出符合条件记录的ROWID,由于ROWID是记录的物理地址,因此可以根据ROWID快速的定位到具体的记录,表中的数据非常多时,引用索引带来的查询效率非常可观。
      

  2.   

    1)您假定的这种情况、会通过INDEX RANGE SCAN扫描索引、而索引键值刚好可以回答你的查询、没必要回表
    2)至于不走索引、有兴趣可以参考我的文章:深入理解Oracle索引(23):6 种常见不走索引的原因分析:http://blog.csdn.net/linwaterbin/article/details/9077483
      

  3.   

    在没有建索引的时候,它是一条一条去比较,也就是进行全表扫描。当你为id这一列建立了索引,它首先会进行一次全表搜索,获取到id字段每条记录的数据,并其升序排列,然后将排序后的id字段的记录与对应的rowid伪列(对应记录的物理存储位置)相匹配存储在索引段中,在索引段中只保存id和rowid的值,格式为“id,rowid”。
    当你的查询条件中有id字段,oracle会对索引段中的id列进行快速搜索(因为已经排序,所以会使用各种快速搜索算法,如二分法),找到满足条件的id,最后通过在索引段中找到符合id对应的rowid,然后根据rowid在student表中读取相应的记录。