2009-04-16 113 views
2

如何在適當的情況下向某些人解釋索引如何提高數據庫的性能?我正在尋找一個好的,明確的解釋,因爲它在書中太複雜了。數據庫索引

回答

9

忍受着我,這將需要一段時間:-)。

一個簡單的地址簿,你只需添加上新的朋友或同事到達結束記錄的認爲(下一個條目會去5):

1. Bob Smith, 7 Station St, Wotahole, NJ 
2. Greg Jones, 3 Railway Pde, Boot Hill, KA 
3. Allan Brown, 27 Carriage Court, Washington, DC (home) 
4. Allan Brown, 1066 Hastings Street, Washington, DC (work) 
5. 

現在,你需要找人的地址。沒問題,我聽到你說,只是掃描名單尋找名稱,然後讀取地址。

現在,如果你非常受歡迎以至於你有1,024位像我這樣的朋友(我是這樣一個極客,我只分配兩個冪級別的朋友 - 我實際上有2,024個,但其中有1,000個正在我可以再一次找到24個:-)。

爲了找到一個特定的朋友,你必須平均掃描512個條目(使用中的一半)。這很乏味。最糟糕的情況是掃描全部1,024個,找到您添加的最後一個人。

現在讓我們添加該索引。每當你添加一個新朋友/同事(或者如果他們導致你太多麻煩,刪除他們),你更新這個索引,只存儲排序順序的名字以及完整條目的行號(地址中的索引頁書是魔法並自動分類你寫的所有內容)。

用於輸出迷你列表索引上面會:

1. Allan Brown, 3 
2. Allan Brown, 4 
3. Greg Jones, 2 
4. Bob Smith, 1 

的名稱和行號佔用較少的空間比全項,但最重要的方面是這樣的。

爲了找到一個條目,您只需掃描,最壞的情況下,10個條目(日誌 1024)。首先,檢查索引號碼512.如果您要查找的名稱大於該名稱,則只需查看條目513-1024。如果少了,你現在只對條目1-511感興趣。無論哪種情況,您都會立即將搜索空間減半。

使用原始方法,您只能丟棄您檢查的方法,因爲您沒有可用的訂購信息。

所以搜索空間的大小是這樣的(我實際使用的兩個大國的索引方法,但它比這稍好):

+-----------+----------------+------------+ 
| Iteration | Indexed method | Old method | 
+-----------+----------------+------------+ 
| 0  | 1024   | 1024 | 
| 1  | 512   | 1023 | 
| 2  | 256   | 1022 | 
| 3  | 128   | 1021 | 
| 4  |  64   | 1020 | 
| 5  |  32   | 1019 | 
| 6  |  16   | 1018 | 
| 7  |  8   | 1017 | 
| 8  |  4   | 1016 | 
| 9  |  2   | 1015 | 
| 10  |  1   | 1014 | 
+-----------+----------------+------------+ 

一旦你找到了指數,從中提取行號,並且由於您知道每頁有16個條目,因此條目號275(例如)位於第18頁的第4行。您可以直接到那裏而無需進一步搜索。

因此,以更多的存儲空間和一些維護索引爲代價,大大提高了搜索速度。這也是索引在數據庫中的作用。

3

我會使用經典解釋:

索引提供一個有序和迅速的方法來遍歷一個數據集。

典型的例子是電話本 - 按字母順序按名稱INDEXED - 這可以加快您的訪問速度,因爲您可以直接使用索引方法直接找到想要查找的名稱。

數據庫真的沒有什麼不同 - 您不必爲僱員的EmployeeId = 123掃描整個表。您只需掃描索引,按已知順序存儲,最終表現會更好。

+0

電話簿比喻常常用於解釋索引的作用 – RobS 2009-04-16 04:38:11

+0

我們正接近電話簿比喻剛剛被空洞的目光接收的時間點。 – 2009-04-16 04:56:53

1

數據庫索引有助於快速在數據庫表中的數據庫查詢記錄,很像一個索引可以幫助你在一本書中快速查找信息。我認爲關鍵是索引正確的數據,以便數據庫可以快速查找最有意義的數據。以本書爲例,您不會爲每一個單詞編制索引,您只需索引用戶最想查找的關鍵詞。

3

如果您的問題中的關鍵詞是「明智的」,那麼重要的是要指出,索引的好處是快速查詢的情況下,權衡是速度和大小。

就像在電話簿中一樣,維護索引需要一些額外的時間,而索引本身也有一點空間。無論何時將記錄添加到數據庫或從數據庫中刪除記錄,都需要花費一些時間來更新索引。

因此,使用插入率高的數據庫上的索引過度使用可能不被認爲是明智的使用。但是,若想通過索引來加快查詢速度,可能會對性能產生巨大的好處。

0

當搜索數據時,如果用於搜索的字段被編入索引,則會直接引用數據(或數據範圍,但不包含非技術性話題)。

如果它們沒有被編入索引,那麼它必須搜索整個表格進行匹配比較。