oracle索引如何快速查找

时间:2015-11-20 05:56:38

标签: database oracle indexing

我阅读并观看了很多博客和视频,所有人都在讨论 -

  1. 如何创建索引
  2. 索引类型
  3. 索引内部结构如何不同。
  4. 但没有一篇文章解释过这个 -

    • 什么索引特殊,以便查找变得快速?

    是否将值(列值)缓存在内存中? 请用你的想法启发我。

    谢谢。

2 个答案:

答案 0 :(得分:1)

它使得它更快,因为索引为数据添加了结构。

考虑一个电话簿,其中所有名称都没有按特定顺序存储,查找特定人员编号非常耗时,但如果按字母顺序存储名称,则更容易,更快捷。那将是数据库中的聚簇索引。

书中的索引页面将是一个非聚集索引,我会在其中找到一个特定页面,其中包含我首先在索引页面上查找的内容。

答案 1 :(得分:1)

数据库在光盘上的物理块中存储表的行。让我们以一个存储客户信息的公司的示例数据库为例  为新客户添加行时,数据库会将此信息存储在其中一个可用块中,并为其分配一个rowId。

当您搜索客户时,如果数据库知道rowId,它可以快速找到客户记录并显示它。这是因为rowId指向存储此特定客户信息的物理块。

但是当我们搜索客户时,我们会根据某个字段(如姓氏)来搜索。这是索引的来源。索引是一个有组织的结构,提供从字段值到rowId的快速映射。

当向表中添加新行时,数据库会记录rowId并使用字段值(例如姓氏)到rowId的映射更新索引。其中一个常用索引具有树结构。

如果没有索引,数据库必须对所有行进行线性搜索(全表扫描)才能找到特定的姓氏。

假设客户的姓氏以M开头。这导致搜索到索引的M部分。与表格的线性搜索相比,这很快将搜索范围缩小到整体的1/26部分,因为我们已经消除了姓氏以其他任何25个字母开头的索引部分。
这同样适用于下一步搜索。假设客户姓氏的第二个字母是o。这进一步将字段缩小到以M开头的姓氏的1/26。继续,在几个步骤中,索引会快速将姓氏Moore映射到客户的rowId。

可以通过添加另一个字段来扩展相同的想法,比如说索引的名字。如果有100万客户,通过遍历索引树结构的几个步骤,数据库可以快速找到rowId并避免搜索百万行。