【问题标题】:How oracle indexes makes lookup fast [closed]oracle 索引如何使查找快速[关闭]
【发布时间】:2016-02-22 13:00:05
【问题描述】:

我阅读并观看了很多博客和视频,都在谈论-

  1. 如何创建索引
  2. 索引类型
  3. 不同的索引内部结构如何。

但没有一篇文章解释这一点-

  • 什么特殊的索引可以使查找变得更快?

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

谢谢。

【问题讨论】:

  • 一本书的索引页有什么帮助?它适用于相同的概念。

标签: database oracle indexing


【解决方案1】:

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

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

但是,当我们搜索客户时,我们会根据某些字段(例如姓氏)进行搜索。这就是索引的用武之地。索引是一种有组织的结构,可提供从字段值到 rowId 的快速映射。

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

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

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

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

【讨论】:

  • 这是很棒的解释。谢谢托马斯。
【解决方案2】:

它使它更快,因为索引将结构添加到数据中。

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

一本书中的索引页面将是一个非聚集索引,我可以通过首先在索引页面上查找来找到包含我要查找的内容的特定页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-09
    • 2011-04-09
    • 2021-02-28
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多