第二章 索引與散列
數據庫索引如何創建,SQL語句是什么?
Create (unique)index <index-name> on <relation-name>
(<attribute-list>);
案例:
Create index dep_index on instructor(dept_name);
Create unique index dep_uni on instructor(dept_name);
(甚至可以創建多碼索引)
Create index salary_name on instructor(dept_name, salary);
用途例示:
select ID
from instructor
where dept_name=“finance”and salary=80000;
一、索引簡介
1)到底什么是(數據庫)索引?
2) 索引的作用和類型?
3) 什么是搜索碼和索引項(索引記錄)?
(數據庫)索引是一種與(數據庫)文件相關聯的附加結構,額外增加的一個輔助文件!P.268
在關系數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。
在數據庫系統中建立索引主要有以下作用:
(1)快速取數據;
(2)保證數據記錄的唯一性;
(3)實現表與表之間的參照完整性;
(4)在使用ORDER by、group by子句進行數據檢索時,利用索引可以減少排序和分組的時間
相關概念:順序索引、散列索引
因素:訪問類型、訪問時間、插入時間、刪除時間、空間開銷
搜索碼:用於在文件中查找記錄的屬性或屬性集稱為搜索碼。
索引項:由一個搜索碼值和指向具有該搜索碼值的一條/多條記錄的指針構成。
(索引項/索引記錄是構成索引結構/索引文件的基本要素)
一、順序索引
1. 順序索引的基本概念
1)什么是順序索引,有哪些不同類型?
順序索引:基於搜索碼值的順序排序 (指索引項在索引文件中)
主索引:索引文件排序與數據文件排序相同(只能有一個)
如果包含記錄的文件按照某個搜索碼指定的順序排序,那么該搜索碼對應的索引稱為聚集索引。也叫主索引。
輔助索引:索引文件排序與數據文件排序不相同(可多個)
聚集縮影的搜索碼常常是主碼,盡管並非必須如此。
搜索碼指定的順序與文件中記錄的物理順序不同的索引稱為非聚集索引或輔助索引。
2.稠密索引和稀疏索引
2)稠密索引與稀疏索引有何不同?
3) 索引項的次序必需與記錄的次序相同嗎?
4)稀疏索引相比稠密索引的好處?
5)(即使稠密)索引為何能加快查找效率?
2)
稠密索引:索引文件中,每個搜索碼都有一個索引項
稀疏索引:索引文件中,只為某些搜索碼建立索引項
3)
稠密索引:可次序不同.圖1中的次序相同,因為它恰巧是主索引!
稀疏索引:次序需相同.只有主索引才能使用!
4)1)降低索引文件空間開銷,
2)提高搜索效率(跳躍查找)
5)1)索引小,可在內存中處理
2)索引排了序,查找效率高
3)避免逐個讀全部記錄文件
3. 多級索引
6)什么是多級索引,有何好處?
多級索引:在索引文件上再建索引!

多級索引好處:進一步提高記錄查找效率!


4.輔助索引
7) 輔助索引有何特點?
8) 輔助索引中,為何需要引入間接指針?
7)輔助索引:必須是稠密索引!
對每個搜索碼都有一索引項,
對每個記錄有一個地址指針。
8)注:可建立多屬性上的復合索引(請自行舉出一個實例) p.273

三、B+樹索引
1)B+樹中包含哪些類型節點,節點的結構?
3)如何基於B+樹索引快速查找記錄?


4)如何在B+樹上插入一個搜索碼?

5)如何在B+樹上刪除一個搜索碼?

四、散列索引
散列索引:采用散列函數將搜索碼映射到散列桶通過散列索引,支持基於搜索碼的記錄快速查找
1)什么是散列索引,主要特點?
2)如何插入/刪除一個索引項?
3)如何查找記錄?

例中散列函數:IDmod8(對8取模)
設計散列函數:散列值分布均勻
桶數:N(例子中為8個桶)(1個散列桶,為一個磁盤塊,p.288但也可以小於或大於一個磁盤塊)
溢出桶(可能多個,尤其不均勻時)當某桶裝滿時,存儲溢出索引項
插入一個索引項:計算搜索碼的散列值確定桶然后在相應桶中寫入索引項
刪除一個索引項:計算搜索碼的散列值確定桶然后在相應桶中刪除索引項
查找記錄:計算搜索碼的散列值確定桶然后在相應桶中得到索引項根據索引項中指針得到記錄
動態散列(自學)
散列桶數目不固定,通過散列前綴i控制,開始非常少,隨索引項增加而逐漸增大!
In this structure, i2 = i3 = i (=2), whereas i1 = i – 1 (=1) 而 i=2
(see next slide for details)
5)如何在動態散列中定位和插入記錄?
如何知道(桶地址表)指向同一桶: Each bucket j stores a value ij 正整數
- All the entries that point to the same bucket have the same values on the first ij bits.
如何定位屬於哪一桶:To locate the bucket containing search-key Kj:
-
Compute h(Kj) = X 即計算該搜索碼Kj相應的二進數表示
-
Use the first i high order bits of X as a displacement偏轉/位移 into bucket address table, and follow跟隨 the pointer to appropriate bucket
桶地址表中指向桶j的表項編號(的計算公式)為: 2(i-ij)
如何插入記錄:To insert a record with search-key value Kj
-
follow same procedure as look-up and locate the bucket, say j. (桶j)
-
If there is room in the bucket j, insert record in the bucket.
-
Else the bucket must be split and insertion re-attempted 重試 (will see in next slide)
-
Overflow buckets used instead in some cases (will see in next slide)
散列函數h為每個鍵計算出一個K位二進制序列,該K足夠大,比如32。但是,桶的數目總是使用從序列第一位或最后一位算起的若干位,此位數小於K,比如說是i位。也就是說,當i是使用的位數時,桶數組將有2i個項。
假定K=4,即散列函數h只產生4位二進制序列。當前使用的只有其中一位,正如桶數組上方的框中i=1所標明的那樣。因此,桶數組只有兩個項,一個對應0,一個對應1。

我們在前面圖表中插入一個鍵值散列為1010序列的記錄。因為第一位是1,所以該記錄屬於第二個塊。然而,該塊已滿,因此需要分裂。這時我們發現j=i=1,因此我們首先需要將桶數組加倍,如圖所示。圖中我們已將i設為2。

我們插入鍵值分別列為0000和0111的記錄。這兩個記錄都屬於圖中第一個存儲塊,於是該塊溢出。因為該塊中只用一位來確定其成員資格。
而i=2,所以我們就不用調整桶數組。我們只需分裂該塊,讓0000和0001留在該塊,而將0111存放到新塊中,桶數組中01項改為指向新塊。
插入一個鍵值為1000的記錄

1、簡述稀疏索引和稠密索引的優缺點及應用場景?
稀疏矩陣占用的空間小,速度慢,精確率相對於稠密索引低,插入、刪除記錄代價較大。常應用於搜索引擎搜索記錄的數據庫。
稠密索引占用的空間大,速度快,方便插入刪除。常應用於訂單數據庫,精准,快速。
2、散列索引和順序索引的區別是什么?
順序索引:基於搜索碼值的順序排序
散列索引:采用散列函數將搜索碼映射到散列桶,通過散列索引,支持基於搜索碼的記錄快速查找