1. 程式人生 > >快閃記憶體資料庫索引優化

快閃記憶體資料庫索引優化

快閃記憶體資料庫的索引是資料庫特有的一種加快查詢的方法,這種方法可以 有效的提高資料庫查詢的效能,基本上每一種資料庫都會有索引的功能,那麼索引的帶來的額外的元資料開銷也是非常大的。

目前的索引組織的資料結構都是按照磁碟的特性,用來設計對應的資料結構,當底層的儲存介質換成快閃記憶體之後,傳統的索引的資料結構可能就不太實用了,因此需要去設計面對快閃記憶體的資料庫的索引。 在這裡插入圖片描述

1、快閃記憶體的儲存特性,在傳統資料庫的索引上會有哪些影響,傳統的資料庫索引的設計會帶來哪些問題

傳統的資料庫的設計大都採用了B樹或者B+樹,這種資料結構由於索引的更新,對於傳統的磁碟可能影響不大,因為是使用本地更新,更新索引之後的地址是不變的,那麼其他索引指向的指標不需要發生改變,但是當儲存介質變成了快閃記憶體之後,快閃記憶體支援異地更新,那麼更新的索引值會有其他的地址,那麼連帶的反應,其他指向的這個節點的索引節點都是變換,產生一個擴散的效應。因此會造成快閃記憶體更多的寫操作,所以,對於針對真誠的特性設計相應的索引結構。 在這裡插入圖片描述

2、傳統的資料庫的索引主要有兩種資料結構來組織,一種是B樹,一組是B+樹,這兩種資料結構的區別是什麼呢?

對於B樹來說,每個節點都儲存三個資訊,一個是索引值,另外一個是該索引值對應的資料記錄的地址指標,還要一個位置指標,指向下一個節點。 在這裡插入圖片描述

B樹的查詢過程:

首先索引在B樹進行查詢,從根節點開始一層一層的查詢,找到一個對應的節點,然後從這個節點中取出對應索引的資料指標,從這個指標找到對應的資料。

B樹的插入過程:

如果要插入一個記錄,實際就是插入一個索引,這個時候,選擇一個合適的葉子節點進行插入,如果插入葉子節點但是葉子節點超過了一個頁的大小,這個時候將這個葉子節點進行分裂,取一個節點到上層的父子節點,如果父子節點還是滿的時候,繼續分裂,知道根節點,最壞的情況是在產生一個根節點。

B樹的刪除過程:

如果要刪除某個記錄,即要刪除對應的索引,這個時候,如果要刪除的節點不在葉子節點上,這個時候將這個節點和後繼的節點交換位置,然後刪除這個節點。在葉子節點則直接刪除,如果刪除之後,這個節點的索引的個數小於頁的一半,這個時候,可以進行合併操作,將左右的兄弟節點進行一個合併操作。 在這裡插入圖片描述 在這裡插入圖片描述

B+樹

對於B+樹來說,B樹顯然只能進行隨機的查詢,對於順序的查詢,還是得從根節點開始繼續查詢一個路徑。B+樹則不同,B+樹能夠進行隨機查詢,同時能夠支援順序查詢。 B+樹是在B樹上進行了改變,首先,B+樹中包含兩類節點,第一類節點是非葉子節點,第二類節點是葉子節點。對於非葉子節點,都可以看成是索引指標,起著指標連線到葉子節點的作用,用來快速定位某個葉子節點。對於葉子節點,包含了記錄的索引值,和指向記錄的指標,和指向下一個葉子節點的指標,葉子節點本身按照鍵的大小自小二大的順序連結。 在這裡插入圖片描述

對於順序查詢,直接在葉子節點,按照索引的順序從小到達的遍歷查詢即可

對於隨機查詢,按照主鍵的索引值,從根節點開始查詢,如果沒有則通過非葉子節點的指標指向下一個層,直到查詢到葉子節點,確實是否存在,記住對於B+樹來說,隨機查詢都是從根節點查詢到葉子節點的。

插入操作:插入一個數據時,首先還是需要從根節點查詢到葉子節點,找到插入的葉子節點的位置,然後在在這個葉子節點進行插入索引,如果葉子節點空間不夠,則進行分裂,如果葉子節點空間夠,則直接插入。

刪除操作:刪除一個數據時,同樣首先找到葉子節點,因為所有的資料都存在葉子節點上,所以必須得去找到葉子節點。然後如果葉子節點比較少,這個時候會發生合併操作,然後刪除。 在這裡插入圖片描述

3、瞭解了B樹和B+樹的基本知識後,對於傳統的B、B+樹的索引結構,遷移到快閃記憶體上有哪些問題,目前有哪些改進的方法?

B樹存在的缺點:

在這裡插入圖片描述

B+樹存在的缺點:

同樣,B+樹在葉子節點的更新增刪,都會產生擴散的影響,造成多次的快閃記憶體寫操作,代價較大。

4、對於索引的各種改進的方法

對於B樹

一種基於日誌的B樹索引方法的體系架構BFTL 對於B++樹 惰性更新B+樹 FlashDB

對於直接更改整個資料結構,重新其他的樹結構

FD樹 LA樹

下面對5種改進方法做一個簡單的總結。

5、一種基於日誌的B樹索引方法的體系架構BFTL

基本思想:

在這裡插入圖片描述 在這裡插入圖片描述 簡單來說,他的思想是因為B樹的節點更新帶來大量的擴散性更新,那麼採用日誌的方法,將這些更新通過一個緩衝區,保留這些記錄,讓這些記錄通過緩衝區,減少寫到快閃記憶體的更新寫的次數。

當緩衝區被記錄塞滿的時候,這個時候就需要替換出去,BFTL為每個記錄都設定對應索引值,將索引單元拼湊成為一個頁,那麼對於同一個物理節點的資料,可能更新的記錄存放在不同的物理頁上,通過一個轉換表去記錄存在哪些物理頁上。在執行B數的查詢時,首先查詢轉換表可以直接查詢到每個快閃記憶體物理頁對應的B節點的最新值,這樣不用去遍歷快閃記憶體。

具體實現:

在這裡插入圖片描述

優點:

在這裡插入圖片描述

缺點:

在這裡插入圖片描述 在這裡插入圖片描述

6、惰性更新B+樹

傳統的對B+樹的更新,都是在緩衝區緩衝一部分預讀出來的節點,這樣不用總是去快閃記憶體上讀節點,但是這樣受限於緩衝量,並不能減少太多讀寫操作。

惰性更新B+樹的基本思想:

在這裡插入圖片描述 在這裡插入圖片描述 思想比較簡單,就是設定一個惰性更新池,對所有節點的更新操作,都不直接更新,而是直接寫入到這個更新池,在更新池中對請求進行合併去掉冗餘,然後當更新池滿了之後,觸發一個提交操作,批量的寫入到快閃記憶體中,並行更新B+樹的結構。

具體實現:

在這裡插入圖片描述

優點:

優點很明顯,通過惰性緩衝區,進行批量的更新操作,減少了更新的寫操作,從而對快閃記憶體的寫操作減少,提升寫效能。

7、FlashDB

基本思想:

在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 思想並不難,主要思想是,節點寫入的方式不一樣,一種是以頁寫入,一種是以日誌寫入,前面在資料庫儲存管理器優化中提到過,以頁寫入,寫效能差,但是讀效能好;以日誌寫入,寫效能好,但是讀效能差,那麼FlashDB就是通過對負載進行感知,動態的調整B樹的節點,在不同的負載下達到一個最優。

具體實現

在這裡插入圖片描述 在這裡插入圖片描述

優點:

採用日誌寫的方式可以通過批量寫,減少寫入的次數,解決快閃記憶體普遍存在的問題。同時可以通過負載感知,來切換節點的型別,可以到達最優解。

8、FlashDB

基本思想:

在這裡插入圖片描述

具體設計

在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述

9、LA樹

之前的對B+樹的優化都是通過日誌批量寫入的方式,這種方式有效的降低了寫操作的代價,但是同時,增加的讀操作的代價。LA樹區別於之前的這些方法,提出了一種新的面向快閃記憶體的資料結構,採用了惰性更新技術。

基本設計思想

在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述

具體實現

在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 思想:實際是通過一個多級的快取,延時更新操作,最後當更新操作推送到了葉子節點層,這個時候將同一個葉子節點的索引一起更新,這樣不會增加額外的更新寫開銷,從而減小更新寫這個問題。

10、總結

所以總的來說,索引需要解決的就是異地更新,讀寫代價不一致導致的大量的更新寫的問題,基本解決的辦法都是通過設定緩衝區,不管是多層還是一層,緩衝區來記錄日誌,將更新寫推遲寫入到快閃記憶體上,最後批量寫入對一個頁的更新,合併更新,通過這種方法減少更新寫的次數。

那麼優化的方法,可以在傳統的B樹或者B+樹上優化,也可以自己建立一個新的資料結構,LA樹