溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

數(shù)據(jù)庫索引與全表掃描有什么區(qū)別

發(fā)布時間:2022-01-06 17:28:50 來源:億速云 閱讀:225 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“數(shù)據(jù)庫索引與全表掃描有什么區(qū)別”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“數(shù)據(jù)庫索引與全表掃描有什么區(qū)別”吧!

磁盤結(jié)構(gòu)和基本耗時

磁盤的組織結(jié)構(gòu) 盤片->磁道->扇區(qū)。由于盤片是并行操作的,因此可以忽略尋找盤片的時間。所以基本上要找一個數(shù)據(jù)需要找到對應(yīng)的磁道(類似樹的年輪),再找對應(yīng)的扇區(qū)(一段扇形)。

磁盤性能的主要度量指標有以下幾個:

訪問時間:從發(fā)出讀寫請求到數(shù)據(jù)開始傳輸之間的時間。也就是磁盤定位數(shù)據(jù)的時間,在程序中就是那個 seek。訪問時間包括尋道時間(找磁道)和旋轉(zhuǎn)等待時間(找扇區(qū))。一般在幾毫秒級。

數(shù)據(jù)傳輸率:在定位數(shù)據(jù)之后。就開始將數(shù)據(jù)從磁盤和內(nèi)存之間傳輸了。這個時間一般每秒幾十MB。

順序訪問 vs 隨機訪問

磁盤上的文件是一塊一塊組織的,這里的塊(block)是邏輯概念,可能512字節(jié)到幾KB。從磁盤讀數(shù)據(jù)需要一塊一塊讀。即使你只讀1Byte數(shù)據(jù),也會讀一塊。

順序訪問:連續(xù)訪問磁盤相鄰的塊。這樣磁盤只需要一次磁盤尋道。

隨機訪問:隨機訪問磁盤不同位置的塊,一般每次只讀少量數(shù)據(jù)。這樣磁盤每處理一個隨機訪問請求就需要一次磁盤尋道。隨機訪問的效率遠低于順序訪問。

存儲模型

硬件:磁盤數(shù)據(jù)傳輸率記做 T,平均訪問時間記為 S。

數(shù)據(jù):一個包含 N 個數(shù)據(jù)的數(shù)據(jù)集,數(shù)據(jù)是可比較的。數(shù)據(jù)在磁盤上無序存儲,數(shù)據(jù)均勻分布。每個數(shù)據(jù)所占空間為 X,那么數(shù)據(jù)的總大小為 NX。

這張圖表示數(shù)據(jù)在磁盤上的存放順序:

數(shù)據(jù)庫索引與全表掃描有什么區(qū)別

索引:在數(shù)據(jù)上建立索引,索引可以看成數(shù)據(jù)的一種映射,一種表示方式。可以全部放在內(nèi)存中,并且精確定位原始數(shù)據(jù)。

查詢流程

查詢模式:查詢有過濾條件,假設(shè)過濾條件的選擇度為 F,意思是查詢結(jié)果集占總數(shù)據(jù)量的 F 倍,F(xiàn) 處于 [0,1] 之間。

現(xiàn)在有兩種查詢方式:全表掃描、索引。全表掃描和索引都是邏輯概念。

全表掃描:最簡單的查詢操作。即將數(shù)據(jù)從磁盤上一個個讀到內(nèi)存中做過濾,最后返回結(jié)果。這種方式的特點是不管數(shù)據(jù)有沒有用,都先讀出來,磁盤讀取數(shù)據(jù)總量大,但是seek只有一次。對應(yīng)磁盤的順序訪問。

黃色表示需要從磁盤讀到內(nèi)存中的數(shù)據(jù),全表掃描時候就是這樣:

數(shù)據(jù)庫索引與全表掃描有什么區(qū)別

全表掃描總耗時 = IO耗時 = NX/T

索引:由于磁盤上數(shù)據(jù)是亂序的,我們建一個B+樹索引,并在內(nèi)存中維護索引,索引將所有數(shù)據(jù)排序,并記錄對應(yīng)的磁盤位置。在查詢時,首先在索引上過濾出所有結(jié)果集在磁盤上的位置,再到磁盤上去精確讀取結(jié)果集。這種包括少量的磁盤IO+大量的 seek。對應(yīng)磁盤的隨機訪問。

效果圖如下圖:磁盤的操作為定位一個數(shù)據(jù),讀取,再定位下一個數(shù)據(jù)......

數(shù)據(jù)庫索引與全表掃描有什么區(qū)別

Seek耗時:NFS

IO耗時:NFX/T

索引查詢總耗時 = Seek耗時 + IO 耗時 = NFS + NFX/T

比較

接下來看看這些參數(shù),在不考慮更新硬件時,磁盤吞吐率 T、平均訪問耗時 S、數(shù)據(jù)量 N、每個數(shù)據(jù)大小 X 都是常量,沒得改。

一共就 NTFSX 五個參數(shù),接下來只有 F 了,這個東西是個變量,取決于查詢過濾條件。比如你想查身高150以上的男生,這個過濾條件就沒啥區(qū)分度,可能 F=0.8,大部分都會被選出來,但是如果查190以上的男生,可能 F=0.1,只有一小部分會被選出來。

有區(qū)別就有不同的應(yīng)對措施,我們可以根據(jù) F 選擇查索引還是全表掃描。直接算一下什么時候索引查詢比全表掃描快,也就是下邊這個式子:

NFS + NFX/T < NX/T

即:F < X / (TS+X)

可以看到,跟總數(shù)據(jù)量沒關(guān)系,當 F 足夠小的時候,選擇索引比較好。如果結(jié)果集比較多,seek過多,那么全表掃描是更優(yōu)的。

例子

舉個實際例子感受一下:

平均Seek時間: S=5 ms

磁盤吞吐率:T=300 MB/s

單個數(shù)據(jù)大?。篨=128 Byte

這個時候,過濾條件的選擇度需要小于 0.008%。

到此,相信大家對“數(shù)據(jù)庫索引與全表掃描有什么區(qū)別”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI