Sql 索引访问的概念

Sql 索引访问的概念,sql,oracle11g,Sql,Oracle11g,我对甲骨文的探索非常陌生,阅读了有关索引访问的内容,我得出了一个结论,假设我有一个表emp 这就是主键empno上唯一索引的创建方式 其中“-”表示某个十六进制值,假设我编写一个 然后它将取出对应于索引值5的rowid,并从emp表中获取对应于5 empno的行 现在我怀疑的是,它是从index_表中获取的,但是为了找到rowid,它也在扫描整个表(index_表)直到5,同样使用rowid来查找行,那么它与没有索引的表有何不同呢?我们也在扫描整个表直到5 唯一的优点是索引按升序存储 我知道我错

我对甲骨文的探索非常陌生,阅读了有关索引访问的内容,我得出了一个结论,假设我有一个表emp

这就是主键empno上唯一索引的创建方式

其中“-”表示某个十六进制值,假设我编写一个

然后它将取出对应于索引值5的rowid,并从emp表中获取对应于5 empno的行

现在我怀疑的是,它是从index_表中获取的,但是为了找到rowid,它也在扫描整个表(index_表)直到5,同样使用rowid来查找行,那么它与没有索引的表有何不同呢?我们也在扫描整个表直到5

唯一的优点是索引按升序存储

我知道我错了,但有人能解释一下吗

是否进行全表扫描,扫描每一行和每一列,而不考虑其过滤条件? 让我们看一下我上面使用的查询,如果表emp上没有主键,那么它将执行完整表扫描,然后对于empno=5,它将扫描每一行empno值,还是还会扫描empname、salary和mrgid


对于索引表,您可以在主键之外的其他位置使用它。对于任何其他列,数据的顺序可能都不太好,比如您提供的示例中的“salary”


在这种情况下,使用索引表会很有用,特别是当您有数千个条目时。

对于索引表,您可以在主键之外的其他地方使用它。对于任何其他列,数据的顺序可能都不太好,比如您提供的示例中的“salary”

在这种情况下,使用索引表会很有用,尤其是当您有数千个条目时。

在您发布的示例中,Oracle(或任何其他数据库)没有扫描整个索引。这就是堆表和索引之间的区别

从广义上讲,你可以将索引与电话簿进行比较。如果你想找到弗兰克·米勒(Frank Miller)在乔治敦(empno=5)的电话号码(rowid),你可以拿起电话簿,找到乔治敦的条目。你不必看整个电话簿,因为你知道城镇是有序的。所以你在中间打开电话簿,发现小镇是蒙大拿城。因为蒙大拿城在乔治敦之后,所以你从现在开始到开始打开电话簿。用这种策略,你会一直坚持下去,直到找到乔治敦。然后你对姓和名做同样的事情

同样,这是有效的,因为城镇、姓氏和名字是按字母顺序排列的。在数据库中,这是由b-树保证的

例如,您可能希望阅读b-树以了解更多信息

编辑:您还询问如果没有主键,数据库是否必须扫描整个表。答案是:是的,如果empno上也没有索引,那么它也必须这样做

在电话簿类比中,这将是一个类似于查找地址为22 Elm Street的所有电话号码的查询。由于电话簿不是按街道名称或门牌号排序的,因此您必须阅读每个条目才能找到相应的电话号码。

Oracle(或任何其他数据库)不会扫描您发布的示例中的整个索引。这就是堆表和索引之间的区别

从广义上讲,你可以将索引与电话簿进行比较。如果你想找到弗兰克·米勒(Frank Miller)在乔治敦(empno=5)的电话号码(rowid),你可以拿起电话簿,找到乔治敦的条目。你不必看整个电话簿,因为你知道城镇是有序的。所以你在中间打开电话簿,发现小镇是蒙大拿城。因为蒙大拿城在乔治敦之后,所以你从现在开始到开始打开电话簿。用这种策略,你会一直坚持下去,直到找到乔治敦。然后你对姓和名做同样的事情

同样,这是有效的,因为城镇、姓氏和名字是按字母顺序排列的。在数据库中,这是由b-树保证的

例如,您可能希望阅读b-树以了解更多信息

编辑:您还询问如果没有主键,数据库是否必须扫描整个表。答案是:是的,如果empno上也没有索引,那么它也必须这样做


在电话簿类比中,这将是一个类似于查找地址为22 Elm Street的所有电话号码的查询。由于电话簿不是按街道名称或门牌号排序的,因此您必须阅读每个条目才能找到相应的电话号码。

Oracle(以及其他RDBMS)中的“正常”索引是一种结构。天哪,要是他们提到这一点就好了

Oracle(以及其他RDBMS)中的“正常”索引是一种结构。天哪,要是他们提到这一点就好了

有一个问题,全表扫描是用特定的列值扫描行,还是不管我们使用什么过滤器都会扫描整行列值,假设我写了一个查询select*from emp,其中empno=3,在这里它将只扫描empno或ename、salary、mgrid等所有列的特定行?我不是100%确定,但我会假设这将参考您正在筛选的值的索引表。一个问题,完整表是否扫描,是否使用特定列值扫描行,或者它是否将扫描整行列值,而不管我们使用的是什么过滤器,假设我编写了一个查询select*from emp,其中empno=3,在这里,它将只扫描empno或ename、salary、mgrid等所有列的特定行?我不是100%确定,但我假设这将参考您正在筛选的值的索引表。感谢Rene的精彩解释,但您能澄清上面问题中提到的另一个疑问吗,我最近更新了这篇文章,感谢雷内精彩的解释,但是你能澄清在abov发布的问题中提到的另一个疑问吗
table emp
---------------------------
empno  ename  salary mgrid
---------------------------
1   ab  200 2
2   bn  900 3   
3   bh  900 1
4   ah  890 4   
5   kk  67  0   
6   ac  9090    
    index table(suppose)
--------------------
rowid  index value  
---------------------
xyzz       1
-          2
-          3
-          4
-          5
-          6
 select * from emp where empno ='5'
**Doubt**