1. 程式人生 > >通俗易懂講索引(一)

通俗易懂講索引(一)

原創文章,轉載請註明出處!

本文目的:通過通俗易懂的方式介紹索引的由來和各類索引的優缺點,文章只求讓讀者對索引由一個感性的瞭解,並未對索引的效能等做詳細探討。不足之處歡迎批評指正。

一 為什麼要用索引?

存在即合理,索引的出現一定有它的原因,否則早已消失。那為什麼要用索引呢?假如現在我們有一份商品清單表,這份清單包括這麼幾項內容:商品的編號,商品的名稱,商品的價格和和商品的庫存。如果表裡只記錄了100個商品,那我們想查詢一個編號為xx的商品多少錢時,最簡單的方法就是從上到下一項一項地挨著看一遍,碰巧了可能第一個就是這樣就一下查到了,可是要是碰不巧那就得看到第100個了。要是商品清單中有一萬個商品或者有百萬甚至上億個商品呢?如果碰不巧豈不是得看到天荒地老才能查到?所以在資料量很大的時候,提高查詢效率非常地重要。而索引出現就是為了解決這個問題。雖然索引種類有很多,形式各不相同,但無論怎麼變索引的目的只有一個就是提高搜尋效率。

那什麼是索引呢?彆著急,我們還是回到商品清單上來。現在我們假設商品清單裡有1億條商品記錄。為了提高查詢的速度,我想到一個辦法。那就是把商品編號這一列單獨拿出來,然後提前把它從小到大排個序。這樣一來,再查詢編號為xx的商品時,我就可以用二分法進行查找了,二分法查詢的時間複雜度是O(logn),那麼從這個已經排好序的編號列表中查到我想要的編號最壞也就不到30次,這可快了不是一點兒半點兒啊。但是光找到這個編號不想啊還是查不到價格,怎麼辦?那我們就在取編號出來的時候也把編號對應的這條記錄的地址也拿出來,這樣找到了編號,就找到了這條商品記錄的地址,也就能一下查到它的價格了。

這個例子中,所有拿出來的編號和地址就組成了一個索引,某條編號和它對應的地址組成了一個索引項。簡單來說,索引就是建立在資料記錄的某個或某些屬性,如例子中的編號,之上的,並且經過重新組織以提高搜尋效率的資料的集合。本質上,索引還是資料,只是為了提高搜尋效率它有它的組織形式,如上圖的順序結構,除此之外它還可能組織成樹形結構等等。如果你對資料結構不太熟悉,還是需要先去熟悉一下的。

二 索引的分類

在提高資料記錄的搜尋效率方面,沒有那種索引是萬能的,只有相對的好還是不好,因此索引也衍生出了很多種類。下面我們就具體來探討一下不同種類索引。

1 線性索引

線性索引顧名思義,索引的索引項是線性排列的。此外,線性索引還有一個要求就是索引項是順序排列的不能是無序的。就像上例中的編號是從小到大線性排列的,它就是一個線性索引。

1.1 稠密索引

什麼是稠密索引呢?在上面的例子中,我們其實建立的就是一個稠密索引。我們把所有的商品編號全部都拿出來進行了排序,因此商品清單裡的每條商品記錄與索引項都是一一對應的。我們有1億條商品記錄,就有1億個索引項。這樣的索引就是稠密索引。之所以叫稠密索引就是因為索引項的數量比較多,跟商品記錄是一樣的。採用二分法的情況下,稠密索引的最壞情況下約需要查詢logn次,時間複雜度為O(logn)。

這裡寫圖片描述

稠密索引的好處是我們可以像上面的例子一樣採用像二分法一樣的演算法來提高搜尋效率,其效果確實是顯而易見的。但是呢,稠密索引也是有很麻煩的缺點,那就是當資料量很大時它的索引項太多了,索引項多就表示資料量很大,資料量大就意味著需要更多的儲存空間。而且由於索引始終要維持有序,插入或刪除記錄時,維護成本也將很高。如果一條索引1KB,那麼5億條索引就得將近5GB,這都放到記憶體中還是有點吃不消啊。可能有人要說了,我的硬碟1T放5GB綽綽有餘。可是,如果真的把索引資料都放到硬碟,我們仍需要把它的一部分載入到記憶體中,而且需要反覆載入不同的部分,這時就得與硬碟進行反覆的IO操作,然而機械硬碟的IO操作是很費時的,這樣效率還是得不到很大的提升啊。要是能把索引項變少都放到記憶體裡,而且還能用像二分法一樣的演算法進行查詢那就好了。這樣的好事有麼?當然有。稀疏索引就解決了這個問題。

相關推薦

通俗易懂索引

原創文章,轉載請註明出處! 本文目的:通過通俗易懂的方式介紹索引的由來和各類索引的優缺點,文章只求讓讀者對索引由一個感性的瞭解,並未對索引的效能等做詳細探討。不足之處歡迎批評指正。 一 為什麼要用索引? 存在即合理,索引的出現一定有它的原因,否

通俗易懂索引

原創文章轉載請註明出處! 1.2 稀疏索引 由於稠密索引中索引項和記錄都是一一對應的,這導致索引項的數量過多。那能不能不一一對應,要是一個索引項能對應100條記錄那麼索引項的數量將降低100倍。答案當然是能,而這正是稀疏索引的思路即一個索引項對應n條記錄。

通俗易懂解析stm32 HAL庫 標準庫 直接配置暫存器 三種開發方式的區別

    通常新手在入門STM32的時候,首先都要先選擇一種要用的開發方式,不同的開發方式會導致你程式設計的架構是完全不一樣的。一般大多數都會選用標準庫和HAL庫,而極少部分人會通過直接配置暫存器進行開發。網上關於標準庫、HAL庫的描述相信是數不勝數。可是一個對於很多剛入門的朋

【SQL server初級】SQL索引

定位 統計表 cut 語法分析 man net 程序代碼 源配置 amount         SQL索引【一】(此文章為“數據庫性能優化二:數據庫表優化”附屬文章之一)   SQL索引在數據庫優化中占有一個非常大的比例, 一個好的索引的設計,可以讓你的效率提高幾十甚

Spring中AOP的一個通俗易懂的理解

學會 事物 nbsp 連接 新的 之前 天都 這不 proxy 這是看到的一個最易懂得AOP簡介了,適合初學者理解。 轉自:http://www.verydemo.com/demo_c143_i20837.html 1.我所知道的aop   初看aop,上來就是一大堆術語,

MySQL數據庫中的索引——索引實現原理

物理地址 關鍵字 必須 增加 pic 搜索索引 而是 哈希索引 掃描 今天我們來探討一下數據庫中一個很重要的概念:索引。 MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取數據的數據結構,即索引是一種數據結構。 我們知道,數據庫查詢是數據庫的最主要功能

數據庫索引

java索引在mysql中也叫做鍵(key),是存儲引擎用於快速找到記錄的一種數據結構。常見索引類型:1. B-Tree索引大多數mysql引擎都支持這種索引;B-Tree通常意味著所有的值都是按順序存儲的,並且每一個葉子頁到根的距離相同;存儲引擎不需要進行全表掃描來獲取需要的數據,取而代之是從索引的根節點開

揹包九-附錄 USACO中的揹包問題

        USACO是USA Computing Olympiad的簡稱,它組織了很多面向全球的計算機競賽活動。         USACO Trainng是一個很適合初學者的題庫,我認為它

mysql之索引

組合索引 pri drop weight var unique 分享圖片 bold key -- 有了表之後單獨為這個表的字段追加一個普通索引的方法,為t1表的id字段創建一個普通索引,起名為idx_id create index idx

java IoC(控制反轉) 通俗易懂的解釋

IoC(控制反轉)   首先想說說IoC(Inversion of Control,控制反轉)。這是spring的核心,貫穿始終。所謂IoC,對於spring框架來說,就是由spring來負責控制物件的生命週期和物件間的關係。這是什麼意思呢,舉個簡單的例子,我們是如何找女朋友的?常見的情況是,我

聯絡人列表字母排序索引

很久沒有寫部落格了,對自己又放鬆了很多。這篇部落格本來早就要寫了,遲遲拖到現在。今天這裡要說的是,聯絡人列表,分組帶索引,即聯絡人按字母順序排列並分組,右邊還有索引條。先看下效果: 就是這麼一個效果,想必大家都想知道是怎麼實現的吧。其實很簡單,接下來我會慢慢講解這個效果

小波變換完美通俗講解系列之

申明:小波變換 完美通俗解讀,是《小波變換和motion訊號處理》系列中的第一篇。 原始出處為​windstorm的網站http://www.kunli.info/,並非本站原創,但這位大師深入淺出的講解了小波變換,是你在學習小波的過程中,必看之作! 《小波變換和motion訊號處理》系列共包含三篇:   

計算機網路之我見-通俗理解計算機網路

寫在前面:計算機網路和“XX語言程式設計師”這個職業也許並不強相關,例如大部分java程式設計師只要懂得如何使用servlet規範API,採用某些MVC框架寫好程式打包部署到tomcat等容器中就能寫出功能強大的“XX管理系統”,然而如果需要編寫那些自己制定協議的基於tcp/

python基礎---有關nparray----切片和索引

    Numpy最重要的一個特點就是其N維陣列物件,即ndarray,該物件是一種快速而靈活的大資料集容器,實際開發中,我們可以利用這種陣列對整塊資料執行一些數學運算。    有關ndarray,我們就從最簡單的一維陣列操作以及其構造開始說起:import numpy as

學習筆記--mysql索引 索引使用,index,key,primary key, unique

所有MySQL列型別都可以被索引,對相關列使用索引是ᨀ高SELECT操作效能的最佳途 徑。根據儲存引擎可以定義每個表的最大索引數和最大索引長度,MyISAM和InnoDB 儲存引擎的表預設建立的都是BTREE索引,支援字首索引,即對索引欄位的前N個字元建立索引

MySQL優化06 索引

  當一張表,把某個列設為主鍵的時候,則該列就是主鍵索引,如面SQL語句所示: CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(25

mysql 索引

普通索引 1、建立表的時候直接指定 CREATE TABLE students( id INT NOT NULL, name VARCHAR(16) NOT NULL, INDEX index

透大資料,我只需要頓飯通俗易懂的大資料解釋

十五年前,剛開始工作,從帝都回老家。 某長輩和藹的問我:“工作了啊,做什麼的?” 我躊躇半天答曰:“挨踢(IT)。” 長輩不假思索的來了一句:“哦,在中關村賣光碟啊!” 我......我.....我......(叔叔,你知道的太多了) 【副菜

編譯原理期末複習考點總結 通俗易懂的方式解釋概念純手打

編譯原理總結 基礎概念 編譯程式是什麼? 能把源語言程式轉換成目標語言程式的程式。 編譯過程 詞法分析: 掃描源程式,將其分解為詞法單元后輸出。 方法:正規式,有限自動

通俗易懂的 OpenGL ES 3.0入門必備知識!!

前言 opengl的入門是個難點,因為在繪製出圖形之前,你必須要學習一大堆的概念,以及部分圖形知識。以至於在程式碼中不迷路-v-!!.接下來就通俗的講解下部分概念知識。希望大家取其精華去其糟粕 頂點(Vertex)      opengl物體圖形都由點、線