從映射觀點看索引

信息檢索主要有“檢”與“索(辦手續)”兩個動作。在圖書館借書時,一般而言,

找書的時間比辦理手續的時間長得多,因而縮短檢查時間是提高效率的關鍵。數據庫中檢

索信息也與此類似。

在沒有索引文件時,DBMS處理用戶查詢的主要操作是:

(1) 通過線性搜索匹配,確定待查信息的位置,進行定位(例如用C語言的fseek)。

(2) 定位記錄作為數據庫當前記錄且裝入工作區,作后續處理(如顯示,計算等等)。

由于采用了數據文件高速緩存,CerBase 中File_IO 模塊的LoadCurrRec(WA_N)函數能

高效地執行第二步。例如,在386/DX40 微機上,用 Turbo Profiler 測得所花平均時間

為T1=1 微秒左右。而作第一步時,平均讀盤次數 A = 被搜索文件大小/ (緩存器大小

× 2)。設每次讀盤時間為 T2 ,(遠大于T1)則總耗時T=T1+ T2×A,顯然,如果能減少

搜索時的讀盤次數A ,就能大大提高檢索效率。

因為A 正比于被搜索文件大小,一個十分自然的解決辦法是建立一個相對較小的, 從

關鍵字到記錄位置的對查表,即下列三元組的集合: (關鍵字,記錄地址,附加信息), 于

是,可以花較少讀盤時間來查表,然后按照記錄地址一次就讀入記錄。上述三元組稱為

索引項。其中,附加信息可以為空。保存索引項集合的文件稱為索引文件。由于索引文件

較主文件小,一般可大大減少定位時所需雙平均讀盤次數。顯然,查表又可視為如下的索

引映射IndexMap : 關鍵字集合 —> 記錄地址集合。

常用的索引映射有下列幾種:

1. 散列函數(Hash)

現實生活中廣泛地使用著散列函數。

例5.1 以年齡為關鍵字,定義Hash(Age) = Age Mod 12,把人按年齡分成12個組,即

通常的12屬相“鼠、牛、虎、兔,...”。 在同一屬相中再線性搜索,尋址效率提高

12倍。

例5.2 影劇場分單雙號進門,相當于Hash(N )= N Mod 2,使觀眾入座速度提高一倍。

例5.3 在英文字典每個字母開始處貼一標簽,相當于定 Hash(WordStr)= WordStr[1],

提高了查字典的效率。

2. 無序索引

索引映射 IndexMap:{關鍵字} --> { 記錄號 } ,而索引文件不排序。平均搜索次

數為關鍵字總數/2 ,由于索引文件比主文件小(通常小一個數量級, 可以全部或大部分

讀入內存,在內存中搜索定位,從而提高了速度。可以比喻為"小無序管大有序"。

例 5.4 一本書的目錄可看成是無序索引映射 IndexMap : 章節名稱集合 —> 頁碼集合。

由于目錄相對較小,易于一目十行地瀏覽,加快了檢索內容的速度。

3. 順序索引(Sequential Index)

在無序索引的基礎上作如下改進:將索引文件排序后保存,因而在索引文件中搜索關

鍵字可以用二分法,計算復雜度為 Log(N ),當N >30 時,就有顯著效益。順序索引

又分為兩類,即"小有序管大有序" 和"小有序管大無序"。

4.稀索引

是"小有序管大有序"的改進型。既然索引文件和主文件都是排序的。那么,隔 N抽

一而建立起來的索引集合就縮小到原來的 1/N,其定位誤差小于N ,然后在N 個項中線性

搜索。

例5.5 英漢字典中的眉索引,再每頁頂上列出當頁的始詞和尾詞,組成了高效的,節省空

間的稀索引。

5.多級索引

有時,在處理數據文件時建立了索引文件,由于的規模仍然太大,為進一步提高速度,

又建立了索引的索引,以及索引的索引的索引。

例5.6 在1971年版的新華字典中查“飛”字,利用了“ 部首檢字”和“檢字表”兩級

索引,因而能在正文中迅速查出釋義,如圖5.1所示。

(建議用Edit HTML方式閱讀圖表)

 ┏━━━━┓  ┏━━━━┓           ┏━━━━━┓
┃ 一劃 ┃ ┃ ┃ ┃ fei┃--稀索引(書眉)
┃ 乙 15 ┃ ┃ 飛:111┃—密索引 ┃ ┃
┃ ┃ ┃ ┃ ┃飛:鳥在 ┃
┃ ┃ ┃ ┃ ┃空中的運動┃
┗━━━━┛ ┗━━━━┛ ┗━━━━━┛


部首檢字 --> 檢字表第15頁 ---> 正文111頁


圖5.1 多級索引,稀索引和密索引

6.結構化索引


設在處理數據文件A.DBF 時建立了索引文件B.NDX,由于 B.NDX 的規模仍然太大,為


進一步提高速度,又建立了索引的索引 C.NDX,以及索引的索引的索引 D.NDX。但這又引


入了新問題:B、 C、 D 三個索引文件的對象層次不同,結構不同,操作三個索引文件比


較繁瑣。 能否用一個結構來實現多重索引的思想呢? 為此,人們研究了各種各樣的結構


化索引。例如二叉樹索引、B—樹,等等。其中最成功的是 B樹及其變種B+樹。


由于B 樹的特色和優異性能,目前的每一個成功的DBMS都采用了B 樹,每一本關于數


據結構的教科書都討論B樹。掌握B 樹的結構及其算法是DBMS開發者不可回避的任務。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535785.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535785.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535785.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JDK源碼解析之 Java.lang.Boolean

Boolean 類是將 boolean 基本類型進行包裝。類型為 Boolean 的對象包含一個單一屬性 value,其類型為 boolean。 此外還提供了許多將 boolean 轉換為 String、String 轉換為 boolean,以及其他一些方法。 一、類定義 public final class Boolean implemen…

MYSQL的集群的安裝與配置(mysql-5.1.21)

具體安裝與配置:1)準備工作:6臺機器,IP地址分別為192.168.0.(231-236)MGM節點:192.168.0.231(232)SQL 節點:192.168.0.233-234NDBD 節點:192.168.0.235-236系統都是REDHA…

JDK源碼解析之 Java.lang.Byte

byte,即字節,由8位的二進制組成。在Java中,byte類型的數據是8位帶符號的二進制數,以二進制補碼表示的整數 取值范圍:默認值為0,最小值為-128(-27);最大值是127(27-1) Byt…

在命令行模式下管理SELinux

作者: Oslad.com (原創!轉載請注明出處) 2006-07-14 在 GUI 圖形界面模式下,要更改 SELinux 的策略使用方式,只需依次點擊“應用程序”,“系統設置”,“安全級別”;然后在“安全級別配置”對…

JDK源碼解析之 Java.lang.Double

Double類是原始類型double的包裝類,它包含若干有效處理double值的方法,如將其轉換為字符串表示形式,反之亦然。Double類的對象可以包含一個double值。 Double類包裝原始類型的值 double中的對象。類型的對象 Double包含一個類型為的字段 doub…

網頁搜索幫助-禁止搜索引擎收錄的方法

什么是robots.txt文件?搜索引擎使用spider程序自動訪問互聯網上的網頁并獲取網頁信息。spider在訪問一個網站時,會首先會檢查該網站的根域下是否有一個叫做robots.txt的純文本文件。您可以在您的網站中創建一個純文本文件robots.txt,在文件中聲明該網站…

JDK源碼解析之 Java.lang.Float

Float類是原始類型float的包裝類&#xff0c;它包含若干有效處理浮點值的方法&#xff0c;如將其轉換為字符串表示形式&#xff0c;反之亦然。Float類的一個對象可以包含一個浮點值 一、類定義 public final class Float extends Number implements Comparable<Float> {…

FTP兩種工作模式:主動模式(Active FTP)和被動模式(Passive FTP)

在主動模式下&#xff0c;FTP客戶端隨機開啟一個大于1024的端口N向服務器的21號端口發起連接&#xff0c;然后開放N1號端口進行監聽&#xff0c;并向服務器發出PORT N 1命令。服務器接收到命令后&#xff0c;會用其本地的FTP數據端口&#xff08;通常是20&#xff09;來連接客戶…

JDK源碼解析之 java.lang.Integer

teger 基本數據類型int 的包裝類 Integer 類型的對象包含一個 int 類型的字段 一、類定義 public final class Integer extends Number implements Comparable<Integer>{}類被聲明為final的,表示不能被繼承;繼承了Number抽象類,可以用于數字類型的一系列轉換;實現了Comp…

Loadrunner的基本概念

1)vuser_init(only one &#xff0c;重復執行腳本的時候&#xff0c;此部分只會執行一次 ) %G< rJc*P 2)action( 一個或者多個 , 重復執行腳本的時候&#xff0c;只有該部分會按重復的次數重復執行 ) z*Xfjy(Mj 3)vuser_end(only one, 重復執行腳本的時候&#xff0c;此…

JDK源碼解析之 java.lang.Long

Long 與Integer 是數值類型中使用頻率最高的兩個,也是提供支持方法最多的兩個 他們提供出來的方法功能也是高度的相似 一、類定義 public final class Long extends Number implements Comparable<Long> {}類被聲明為final的,表示不能被繼承;繼承了Number抽象類,可以用于…

sed教程入門與實例練習(一)

UNIX 世界中有很多文本編輯器可供我們選擇。思考一下 — vi、emacs 和 jed 以及很多其它工具都會浮現在腦海中。我們都有自己已逐漸了解并且喜愛的編輯器&#xff08;以及我們喜愛的組合鍵&#xff09;。有了可信賴的編輯器&#xff0c;我們可以輕松處理任何數量與 UNIX 有關的…

JDK源碼解析之 Java.lang.Short

Short類是基本類型short 的包裝類&#xff0c;它包含幾種有效處理短值的方法&#xff0c;如將其轉換為字符串表示形式&#xff0c;反之亦然。Short類的對象可以包含單個短值。 一、類定義 public final class Short extends Number implements Comparable<Short> {}類被…

sed教程入門與實例練習(二)

讓我們看一下 sed 最有用的命令之一&#xff0c;替換命令。使用該命令&#xff0c;可以將特定字符串或匹配的規則表達式用另一個字符串替換。下面是該命令最基本用法的示例&#xff1a; $ sed -e ’s/foo/bar/’ myfile.txt上面的命令將 myfile.txt 中每行第一次出現的 ‘foo’…

Oracle GoldenGate簡介

一、什么是Oracle GoldenGate&#xff1f; Oracle GoldenGate是用于實時數據集成和復制的綜合軟件包。它支持高可用性解決方案&#xff0c;實時數據集成&#xff0c;事務性更改數據捕獲&#xff0c;數據復制&#xff0c;轉換以及運營和分析企業系統之間的驗證。 使用Oracle G…

sed教程入門與實例練習(三)

在第二篇 sed 文章中&#xff0c;我提供了一些示例來演示 sed 的工作原理&#xff0c;但是它們當中很少有示例能實際做特別有用的事。在這篇 sed 系列的最后文章中&#xff0c;我要改變那種方式&#xff0c;并使用 sed 來做實際的事。我將為您顯示幾個示例&#xff0c;它們不僅…

Oracle GoldenGate微服務架構

Oracle GoldenGate支持兩種架構&#xff0c;經典架構和微服務架構&#xff08;MA&#xff09;。 可以出于以下目的配置Oracle GoldenGate&#xff1a; 從一個數據庫中靜態提取數據記錄&#xff0c;并將這些記錄加載到另一個數據庫中。連續提取和復制事務性數據處理語言&#…

Oracle GoldenGate經典架構

可以使用Oracle GoldenGate Classic Architecture從命令行配置和管理數據復制。 圖示的說明logicalarch2.png 注意&#xff1a; 這是基本配置。根據業務需求和用例&#xff0c;可以配置此模型的不同變體。 1、Manager Manager是Oracle GoldenGate的控制過程。必須先在Oracl…

WordPress 首頁顯示摘要

這里的方法不需要你另外裝插件。 1、使用more標簽 (缺點&#xff1a;每次都要加一下這個東西&#xff0c;不靈活只能一刀切。優點&#xff1a;方法比較正規不需要改動模版) 在你需要截斷的地方(就是你的編輯框)加 <!–more–> 代碼. 2、使用the_excerpt標簽 (缺點&#x…

Oracle GoldenGate復制過程

這兩種Oracle GoldenGate體系結構共有許多數據復制過程。 1、什么是Extract&#xff1f; Extract是一個過程&#xff0c;該過程被配置為針對源數據庫運行或被配置為在下游挖掘數據庫&#xff08;僅Oracle&#xff09;上運行&#xff0c;以捕獲在其他位置的真實源數據庫中生成…