索引是如何工作的?知道上述知識(shí)后 , 索引就更容易理解了 。
舉個(gè)例子 , 想象一下 , 現(xiàn)在有一本500頁(yè)厚包含幾十萬字的字典 , 同時(shí)里面的字是無序排列的 , 現(xiàn)在我需要你從中找出某幾個(gè)字出來同時(shí)不允許查看目錄 。毫無疑問 , 我們只能一頁(yè)一頁(yè)地翻 , 這是非人類能接受的工作 , 我們必然想的是先看目錄 , 找到相關(guān)的字或者偏旁 , 然后去對(duì)應(yīng)的地方查找文字 , 這樣效率就大大提高了 。目錄事實(shí)上就是一種索引 , 其思想一脈相承 。
數(shù)據(jù)庫(kù)的索引類似于書中的這個(gè)目錄 。索引會(huì)幫助我們快速檢索數(shù)據(jù)庫(kù) , 查詢不需要通過整個(gè)表來獲取數(shù)據(jù) , 而是從索引中找到數(shù)據(jù)塊 。以一張數(shù)據(jù)庫(kù)表為例:
上表是一張真實(shí)的數(shù)據(jù)庫(kù)表 , 其中每一行是一條記錄 , 每條記錄都有字段 。假設(shè)上面的數(shù)據(jù)庫(kù)是一個(gè)有10萬條記錄的大數(shù)據(jù)庫(kù) ?,F(xiàn)在 , 我們想從10萬條記錄中搜索一些內(nèi)容 , 那么挨著一個(gè)一個(gè)搜索無疑將花費(fèi)很長(zhǎng)的時(shí)間 , 這個(gè)時(shí)候我們?cè)跀?shù)據(jù)結(jié)構(gòu)與算法里學(xué)的二分查找法就派上了用場(chǎng) 。
二分查找法使用二分查找法 , 需要將數(shù)據(jù)先排序 , 但是其查詢效率將大大提高 。例子如下:
假設(shè)我們?cè)谏厦娴臄?shù)據(jù)庫(kù)中使用的是固定長(zhǎng)度的記錄,固定塊記錄大小為205個(gè)字節(jié) , 默認(rèn)塊大小是1024字節(jié) 。則:
固定記錄大小=204字節(jié) , 塊大小=1024字節(jié)
所以每個(gè)數(shù)據(jù)塊的記錄數(shù)=1024/204=5條記錄 , 10萬條記錄就是2萬個(gè)塊
不使用任何算法 , 我們要查詢100000條記錄中的某一條 , , 在最壞的情況下我們需要遍歷一遍2萬block才能獲得全部100000條記錄 。但如果進(jìn)行二分查找 , 則只需要進(jìn)行20000的對(duì)數(shù)基數(shù)2 , 即14.287712次即可 。這意味著我們只需對(duì)排序后的值進(jìn)行14次搜索 , 就可以使用二分查找到您感興趣的唯一值 。
上圖是對(duì)一串?dāng)?shù)字生成的二叉查找樹 。其時(shí)間復(fù)雜度為O(n)=O(log2N),即以2為底 , n的對(duì)數(shù) 。其中n為查找目標(biāo)群體的總數(shù)據(jù)量 。
例如 , 假設(shè)N為8 , 則O(n) = O(2為第8的對(duì)數(shù)) = O(3).
遍歷方式 , 其時(shí)間復(fù)雜度為O(n)
在上述例子當(dāng)中 , n就是10000 。使用索引的時(shí)間復(fù)雜度為O(2為第10000的對(duì)數(shù)) 大約等于 13. 和O(10000)之間差大概800倍 。
索引為何使得查詢變快?這個(gè)時(shí)候我們就能直接回答上述問題了 , 建立了索引的數(shù)據(jù) , 就是通過事先排好序 , 從而在查找時(shí)可以應(yīng)用二分查找來提高查詢效率 。這也解釋了為什么索引應(yīng)當(dāng)盡可能地建立在主鍵這樣的字段上 , 因?yàn)橹麈I必須是唯一的 , 根據(jù)這樣的字段生成的二叉查找樹的效率無疑是最高的 。
為什么索引不能建立的太多?如果一個(gè)表中所有字段的索引很大 , 也會(huì)導(dǎo)致性能下降 。想象一下 , 如果一個(gè)索引和一個(gè)表一樣長(zhǎng) , 那么它將再次成為一個(gè)需要檢查的開銷 。這就好比字典的目錄非常詳細(xì) , 但是其長(zhǎng)度已經(jīng)和所有的文字一樣長(zhǎng) , 這個(gè)時(shí)候目錄本身的效率就大大下降了 。
索引有弊端嗎?肯定是有的 , 索引可以提高查詢讀取性能 , 而它將降低寫入性能 。當(dāng)有索引時(shí) , 如果更改一條記錄 , 或者在數(shù)據(jù)庫(kù)中插入一條新的記錄 , 它將執(zhí)行兩個(gè)寫入操作(一個(gè)操作是寫入記錄本身 , 另一個(gè)操作是將更新索引) 。因此 , 在定義索引時(shí) , 必須牢記以下幾點(diǎn):
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 高球球桿的種類解析
- 解析產(chǎn)后抑郁癥怎么辦?產(chǎn)后抑郁癥七大預(yù)防措施
- 烈日灼心真相是什么 烈日灼心深度解析
- 無法索引原因和解決措施 百度硬盤搜索無法索引
- 圖文解析其實(shí)操步驟 電腦重裝系統(tǒng)怎么一鍵備份還原
- 解析mini迅雷功能應(yīng)用技巧 mini迅雷怎么寫入軟件
- 全面解析早晚練瑜伽的好處
- 解析led指示燈電阻計(jì)算公式 led指示燈接220v電阻怎么算
- 2者基本區(qū)別解析 java引用傳遞和值傳遞的區(qū)別
- 超詳解析OSI模型知識(shí)點(diǎn) 一二三層交換機(jī)的區(qū)別
