在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

數(shù)據(jù)結(jié)構(gòu)LSM tree核心實(shí)現(xiàn)講解

數(shù)據(jù)分析與開發(fā) ? 來源:sowhat1412 ? 作者:sowhat1412 ? 2021-09-30 14:19 ? 次閱讀

LSM tree (log-structured merge-tree) 是一種對頻繁寫操作非常友好的數(shù)據(jù)結(jié)構(gòu),同時兼顧了查詢效率。LSM tree 是許多 key-value 型或日志型數(shù)據(jù)庫所依賴的核心數(shù)據(jù)結(jié)構(gòu),例如 BigTable、HBase、Cassandra、LevelDB、SQLite、Scylla、RocksDB 等。

LSM tree 之所以有效是基于以下事實(shí):磁盤或內(nèi)存的連續(xù)讀寫性能遠(yuǎn)高于隨機(jī)讀寫性能,有時候這種差距可以達(dá)到三個數(shù)量級之高。這種現(xiàn)象不僅對傳統(tǒng)的機(jī)械硬盤成立,對 SSD 硬盤也同樣成立。如下圖:

LSM tree 在工作過程中盡可能避免隨機(jī)讀寫,充分發(fā)揮了磁盤連續(xù)讀寫的性能優(yōu)勢。

SSTable

LSM tree 持久化到硬盤上之后的結(jié)構(gòu)稱為 Sorted Strings Table (SSTable)。顧名思義,SSTable 保存了排序后的數(shù)據(jù)(實(shí)際上是按照 key 排序的 key-value 對)。每個 SSTable 可以包含多個存儲數(shù)據(jù)的文件,稱為 segment,每個 segment 內(nèi)部都是有序的,但不同 segment 之間沒有順序關(guān)系。一個 segment 一旦生成便不再修改(immutable)。一個 SSTable 的示例如下:

可以看到,每個 segment 內(nèi)部的數(shù)據(jù)都是按照 key 排序的。下面我們來介紹每個 segment 是如何生成的。

寫入數(shù)據(jù)

LSM tree 的所有寫操作均為連續(xù)寫,因此效率非常高。但由于外部數(shù)據(jù)是無序到來的,如果無腦連續(xù)寫入到 segment,顯然是不能保證順序的。對此,LSM tree 會在內(nèi)存中構(gòu)造一個有序數(shù)據(jù)結(jié)構(gòu)(稱為 memtable),例如紅黑樹。每條新到達(dá)的數(shù)據(jù)都插入到該紅黑樹中,從而始終保持?jǐn)?shù)據(jù)有序。當(dāng)寫入的數(shù)據(jù)量達(dá)到一定閾值時,將觸發(fā)紅黑樹的 flush 操作,把所有排好序的數(shù)據(jù)一次性寫入到硬盤中(該過程為連續(xù)寫),生成一個新的 segment。而之后紅黑樹便從零開始下一輪積攢數(shù)據(jù)的過程。

讀取/查詢數(shù)據(jù)

如何從 SSTable 中查詢一條特定的數(shù)據(jù)呢?一個最簡單直接的辦法是掃描所有的 segment,直到找到所查詢的 key 為止。通常應(yīng)該從最新的 segment 掃描,依次到最老的 segment,這是因?yàn)樵绞亲罱臄?shù)據(jù)越可能被用戶查詢,把最近的數(shù)據(jù)優(yōu)先掃描能夠提高平均查詢速度。

當(dāng)掃描某個特定的 segment 時,由于該 segment 內(nèi)部的數(shù)據(jù)是有序的,因此可以使用二分查找的方式,在

O(logn) 的時間內(nèi)得到查詢結(jié)果。但對于二分查找來說,要么一次性把數(shù)據(jù)全部讀入內(nèi)存,要么在每次二分時都消耗一次磁盤 IO,當(dāng) segment 非常大時(這種情況在大數(shù)據(jù)場景下司空見慣),這兩種情況的代價都非常高。一個簡單的優(yōu)化策略是,在內(nèi)存中維護(hù)一個稀疏索引(sparse index),其結(jié)構(gòu)如下圖:

稀疏索引是指將有序數(shù)據(jù)切分成(固定大小的)塊,僅對各個塊開頭的一條數(shù)據(jù)做索引。與之相對的是全量索引(dense index),即對全部數(shù)據(jù)編制索引,其中的任意一條數(shù)據(jù)發(fā)生增刪均需要更新索引。兩者相比,全量索引的查詢效率更高,達(dá)到了理論極限值

O(logn),但寫入和刪除效率更低,因?yàn)槊看螖?shù)據(jù)增刪時均需要因?yàn)楦滤饕囊淮?IO 操作。通常的關(guān)系型數(shù)據(jù)庫,例如 MySQL 等,其內(nèi)部采用 B tree 作為索引結(jié)構(gòu),這便是一種全量索引。

有了稀疏索引之后,可以先在索引表中使用二分查找快速定位某個 key 位于哪一小塊數(shù)據(jù)中,然后僅從磁盤中讀取這一塊數(shù)據(jù)即可獲得最終查詢結(jié)果,此時加載的數(shù)據(jù)量僅僅是整個 segment 的一小部分,因此 IO 代價較小。以上圖為例,假設(shè)我們要查詢 dollar 所對應(yīng)的 value。首先在稀疏索引表中進(jìn)行二分查找,定位到 dollar 應(yīng)該位于 dog 和 downgrade 之間,對應(yīng)的 offset 為 17208~19504。之后去磁盤中讀取該范圍內(nèi)的全部數(shù)據(jù),然后再次進(jìn)行二分查找即可找到結(jié)果,或確定結(jié)果不存在。

稀疏索引極大地提高了查詢性能,然而有一種極端情況卻會造成查詢性能驟降:當(dāng)要查詢的結(jié)果在 SSTable 中不存在時,我們將不得不依次掃描完所有的 segment,這是最差的一種情況。有一種稱為**布隆過濾器(bloom filter)**的數(shù)據(jù)結(jié)構(gòu)天然適合解決該問題。布隆過濾器是一種空間效率極高的算法,能夠快速地檢測一條數(shù)據(jù)是否在數(shù)據(jù)集中存在。我們只需要在寫入每條數(shù)據(jù)之前先在布隆過濾器中登記一下,在查詢時即可斷定某條數(shù)據(jù)是否缺失。

布隆過濾器的內(nèi)部依賴于哈希算法,當(dāng)檢測某一條數(shù)據(jù)是否見過時,有一定概率出現(xiàn)假陽性(False Positive),但一定不會出現(xiàn)假陰性(False Negative)。也就是說,當(dāng)布隆過濾器認(rèn)為一條數(shù)據(jù)出現(xiàn)過,那么該條數(shù)據(jù)很可能出現(xiàn)過;但如果布隆過濾器認(rèn)為一條數(shù)據(jù)沒出現(xiàn)過,那么該條數(shù)據(jù)一定沒出現(xiàn)過。這種特性剛好與此處的需求相契合,即檢驗(yàn)?zāi)硹l數(shù)據(jù)是否缺失。

文件合并(Compaction)

隨著數(shù)據(jù)的不斷積累,SSTable 將會產(chǎn)生越來越多的 segment,導(dǎo)致查詢時掃描文件的 IO 次數(shù)增多,效率降低,因此需要有一種機(jī)制來控制 segment 的數(shù)量。對此,LSM tree 會定期執(zhí)行文件合并(compaction)操作,將多個 segment 合并成一個較大的 segment,隨后將舊的 segment 清理掉。由于每個 segment 內(nèi)部的數(shù)據(jù)都是有序的,合并過程類似于歸并排序,效率很高,只需要

O(n)O(n)的時間復(fù)雜度。

在上圖的示例中,segment 1 和 2 中都存在 key 為 dog 的數(shù)據(jù),這時應(yīng)該以最新的 segment 為準(zhǔn),因此合并后的值取 84 而不是 52,這實(shí)現(xiàn)了類似于字典/HashMap 中“覆蓋寫”的語義。

刪除數(shù)據(jù)

現(xiàn)在你已經(jīng)了解了 LSM tree 讀寫數(shù)據(jù)的方式,那么如何刪除數(shù)據(jù)呢?如果是在內(nèi)存中,刪除某塊數(shù)據(jù)通常是將它的引用指向 NULL,那么這塊內(nèi)存就會被回收。但現(xiàn)在的情況是,數(shù)據(jù)已經(jīng)存儲在硬盤中,要從一個 segment 文件中間抹除一段數(shù)據(jù)必須要覆寫其之后的所有內(nèi)容,這個成本非常高。LSM tree 所采用的做法是設(shè)計一個特殊的標(biāo)志位,稱為 tombstone(墓碑),刪除一條數(shù)據(jù)就是把它的 value 置為墓碑,如下圖所示:

這個例子展示了刪除 segment 2 中的 dog 之后的效果。注意,此時 segment 1 中仍然保留著 dog 的舊數(shù)據(jù),如果我們查詢 dog,那么應(yīng)該返回空,而不是 52。因此,刪除操作的本質(zhì)是覆蓋寫,而不是清除一條數(shù)據(jù),這一點(diǎn)初看起來不太符合常識。墓碑會在 compact 操作中被清理掉,于是置為墓碑的數(shù)據(jù)在新的 segment 中將不復(fù)存在。

LSM tree 與 B tree 的對比

主流的關(guān)系型數(shù)據(jù)庫均以 B/B+ tree 作為其構(gòu)建索引的數(shù)據(jù)結(jié)構(gòu),這是因?yàn)?B tree 提供了理論上最高的查詢效率 O(log n)

O(logn)。但對查詢性能的追求也造成了 B tree 的相應(yīng)缺點(diǎn),即每次插入或刪除一條數(shù)據(jù)時,均需要更新索引,從而造成一次磁盤 IO。這種特性決定了 B tree 只適用于頻繁讀、較少寫的場景。如果在頻繁寫的場景下,將造成大量的磁盤 IO,從而導(dǎo)致性能驟降。這種應(yīng)用場景在傳統(tǒng)的關(guān)系型數(shù)據(jù)庫中比較常見。

而 LSM tree 則避免了頻繁寫場景下的磁盤 IO 開銷,盡管其查詢效率無法達(dá)到理想的 O(log n)

O(logn),但依然非常快,可以接受。所以從本質(zhì)上來說,LSM tree 相當(dāng)于犧牲了一部分查詢性能,換取了可觀的寫入性能。這對于 key-value 型或日志型數(shù)據(jù)庫是非常重要的。

總結(jié)

LSM tree 存儲引擎的工作原理包含以下幾個要點(diǎn):

寫數(shù)據(jù)時,首先將數(shù)據(jù)緩存到內(nèi)存中的一個有序樹結(jié)構(gòu)中(稱為 memtable)。同時觸發(fā)相關(guān)結(jié)構(gòu)的更新,例如布隆過濾器、稀疏索引。

當(dāng) memtable 積累到足夠大時,會一次性寫入磁盤中,生成一個內(nèi)部有序的 segment 文件。該過程為連續(xù)寫,因此效率極高。

進(jìn)行查詢時,首先檢查布隆過濾器。如果布隆過濾器報告數(shù)據(jù)不存在,則直接返回不存在。否則,按照從新到老的順序依次查詢每個 segment。

在查詢每個 segment 時,首先使用二分搜索檢索對應(yīng)的稀疏索引,找到數(shù)據(jù)所在的 offset 范圍。然后讀取磁盤上該范圍內(nèi)的數(shù)據(jù),再次進(jìn)行二分查找并獲得結(jié)果。

對于大量的 segment 文件,定期在后臺執(zhí)行 compaction 操作,將多個文件合并為更大的文件,以保證查詢效率不衰減。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7233

    瀏覽量

    90775
  • SSD
    SSD
    +關(guān)注

    關(guān)注

    21

    文章

    2934

    瀏覽量

    118954
  • 過濾器
    +關(guān)注

    關(guān)注

    1

    文章

    436

    瀏覽量

    20087

原文標(biāo)題:一種對頻繁寫操作非常友好的數(shù)據(jù)結(jié)構(gòu)(核心實(shí)現(xiàn)講解)

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    RK3588 EVB開發(fā)板原理圖講解【八】 RK3588 power Tree

    本帖最后由 瑞芯微方案開發(fā)老王 于 2025-3-1 11:41 編輯 一、RK3588電源架構(gòu)核心特點(diǎn) ?多電源域設(shè)計? 芯片通常劃分為多個獨(dú)立電源域(Power Domain),例如
    發(fā)表于 03-01 11:38

    結(jié)構(gòu)數(shù)據(jù)中臺:企業(yè)AI應(yīng)用安全落地的核心引擎

    在數(shù)字化轉(zhuǎn)型浪潮中,非結(jié)構(gòu)數(shù)據(jù)(如文檔、圖片、音視頻等)已成為企業(yè)核心資產(chǎn),其價值挖掘能力直接影響AI應(yīng)用的效能與安全性。然而,數(shù)據(jù)分散、多模態(tài)處理復(fù)雜、安全合規(guī)風(fēng)險高等問題,嚴(yán)重制
    的頭像 發(fā)表于 02-27 17:06 ?330次閱讀

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-初識設(shè)備樹之設(shè)備樹組成和結(jié)構(gòu)

    的一項(xiàng)技能。設(shè)備樹的起源設(shè)備樹(Device Tree)是一種描述硬件資源的數(shù)據(jù)結(jié)構(gòu),它由uboot傳遞給Linux內(nèi)核,被內(nèi)核解析,內(nèi)核根據(jù)設(shè)備樹中的硬件描述信息加載利用相應(yīng)驅(qū)動資源。在引入設(shè)備樹
    發(fā)表于 01-08 08:32

    飛凌嵌入式ElfBoard ELF 1板卡-初識設(shè)備樹之設(shè)備樹組成和結(jié)構(gòu)

    的一項(xiàng)技能。設(shè)備樹的起源設(shè)備樹(Device Tree)是一種描述硬件資源的數(shù)據(jù)結(jié)構(gòu),它由uboot傳遞給Linux內(nèi)核,被內(nèi)核解析,內(nèi)核根據(jù)設(shè)備樹中的硬件描述信息加載利用相應(yīng)驅(qū)動資源。在引入設(shè)備樹
    發(fā)表于 01-07 09:16

    DDC264配置寄存器數(shù)據(jù)寫入和320 DCLK時鐘脈沖后的回讀數(shù)據(jù)結(jié)構(gòu)是什么?

    配置寄存器數(shù)據(jù)寫入和320 DCLK時鐘脈沖后的回讀數(shù)據(jù)結(jié)構(gòu)是什么? 根據(jù)注和表9,16位配置寄存器數(shù)據(jù),4位修訂ID, 300位校驗(yàn)?zāi)J剑趺纯赡苡?024 TOTAL READBACK BITS, format = 0
    發(fā)表于 11-19 07:58

    視覺軟件HALCON的數(shù)據(jù)結(jié)構(gòu)

    在研究機(jī)器視覺算法之前,我們需要先了解機(jī)器視覺應(yīng)用中涉及的基本數(shù)據(jù)結(jié)構(gòu)。Halcon數(shù)據(jù)結(jié)構(gòu)主要有圖像參數(shù)和控制參數(shù)兩類參數(shù)。圖像參數(shù)包括:image、region、XLD,控制參數(shù)包括:string、integer、real、handle、tuple數(shù)組等。
    的頭像 發(fā)表于 11-14 10:20 ?974次閱讀
    視覺軟件HALCON的<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>

    LSM6DSV16X基于MLC智能筆動作識別(2)----MLC數(shù)據(jù)采集

    MLC 是“機(jī)器學(xué)習(xí)核心”(Machine Learning Core)的縮寫。在 LSM6DSV16X 傳感器 中,MLC 是一種嵌入式功能,它使傳感器能夠直接運(yùn)行基于決策樹的機(jī)器學(xué)習(xí)算法。通過
    的頭像 發(fā)表于 10-22 10:02 ?1197次閱讀
    <b class='flag-5'>LSM</b>6DSV16X基于MLC智能筆動作識別(2)----MLC<b class='flag-5'>數(shù)據(jù)</b>采集

    LSM6DSV16X基于MLC智能筆動作識別(1)----輪詢獲取陀螺儀數(shù)據(jù)

    本文將介紹如何使用 LSM6DSV16X 傳感器來讀取數(shù)據(jù)。主要步驟包括初始化傳感器接口、驗(yàn)證設(shè)備ID、配置傳感器的數(shù)據(jù)輸出率和濾波器,以及通過輪詢方式持續(xù)讀取加速度、角速率和溫度數(shù)據(jù)
    的頭像 發(fā)表于 10-16 10:38 ?864次閱讀
    <b class='flag-5'>LSM</b>6DSV16X基于MLC智能筆動作識別(1)----輪詢獲取陀螺儀<b class='flag-5'>數(shù)據(jù)</b>

    【驅(qū)動教程】iTOP-RK3568開發(fā)板進(jìn)行講解第十三期,主要講解輸入子系統(tǒng),共計24 講

    6.輸入子系統(tǒng)框架分析 7.輸入子系統(tǒng)關(guān)鍵數(shù)據(jù)結(jié)構(gòu)之間關(guān)系 8.認(rèn)識輸入子系統(tǒng)源碼以及裁剪 9.編寫一個最簡單的設(shè)備驅(qū)動層代碼 10.通過最簡單設(shè)備驅(qū)動代碼分析匹配規(guī)則和流程 11.引入多對多的匹配關(guān)系
    發(fā)表于 10-11 11:31

    嵌入式常用數(shù)據(jù)結(jié)構(gòu)有哪些

    在嵌入式編程中,數(shù)據(jù)結(jié)構(gòu)的選擇和使用對于程序的性能、內(nèi)存管理以及開發(fā)效率都具有重要影響。嵌入式系統(tǒng)由于資源受限(如處理器速度、內(nèi)存大小等),因此對數(shù)據(jù)結(jié)構(gòu)的選擇和使用尤為關(guān)鍵。以下是嵌入式編程中常用的幾種數(shù)據(jù)結(jié)構(gòu),結(jié)合具體特點(diǎn)和
    的頭像 發(fā)表于 09-02 15:25 ?866次閱讀

    陀螺儀LSM6DSOW開發(fā)(3)----FIFO數(shù)據(jù)讀取與配置

    本文檔旨在詳細(xì)介紹如何配置和讀取LSM6DSOW傳感器的FIFO數(shù)據(jù)LSM6DSOW是一款高性能的6軸IMU(慣性測量單元),集成了三軸加速度計和三軸陀螺儀。FIFO(先進(jìn)先出)緩沖區(qū)是LS
    的頭像 發(fā)表于 08-05 10:03 ?2484次閱讀
    陀螺儀<b class='flag-5'>LSM</b>6DSOW開發(fā)(3)----FIFO<b class='flag-5'>數(shù)據(jù)</b>讀取與配置

    陀螺儀LSM6DSOW開發(fā)(1)----輪詢獲取陀螺儀數(shù)據(jù)

    本文將介紹如何使用 LSM6DSOW 傳感器來讀取數(shù)據(jù)。主要步驟包括初始化傳感器接口、驗(yàn)證設(shè)備ID、配置傳感器的數(shù)據(jù)輸出率和濾波器,以及通過輪詢方式持續(xù)讀取加速度、角速率和溫度數(shù)據(jù)。讀
    的頭像 發(fā)表于 08-05 09:44 ?2187次閱讀
    陀螺儀<b class='flag-5'>LSM</b>6DSOW開發(fā)(1)----輪詢獲取陀螺儀<b class='flag-5'>數(shù)據(jù)</b>

    驅(qū)動LSM6DS3TR-C實(shí)現(xiàn)高效運(yùn)動檢測與數(shù)據(jù)采集(6)----FIFO數(shù)據(jù)讀取與配置

    緩沖區(qū),用于批量處理和存儲傳感器數(shù)據(jù)。 FIFO(First In First Out)緩沖區(qū)在數(shù)據(jù)采集和處理過程中起著至關(guān)重要的作用。本文將介紹如何在LSM6DS3TR-C傳感器中配置和讀取FIFO
    的頭像 發(fā)表于 07-18 10:58 ?2419次閱讀
    驅(qū)動<b class='flag-5'>LSM</b>6DS3TR-C<b class='flag-5'>實(shí)現(xiàn)</b>高效運(yùn)動檢測與<b class='flag-5'>數(shù)據(jù)</b>采集(6)----FIFO<b class='flag-5'>數(shù)據(jù)</b>讀取與配置

    陀螺儀LSM6DSV16X與AI集成(7)----FIFO數(shù)據(jù)讀取與配置

    LSM6DSV16X是一款高性能、低功耗的6軸IMU傳感器,集成了3軸加速度計和3軸陀螺儀。本文將詳細(xì)介紹如何配置和讀取LSM6DSV16X傳感器的FIFO數(shù)據(jù),包括初始化、配置以及數(shù)據(jù)
    的頭像 發(fā)表于 07-18 10:40 ?2076次閱讀
    陀螺儀<b class='flag-5'>LSM</b>6DSV16X與AI集成(7)----FIFO<b class='flag-5'>數(shù)據(jù)</b>讀取與配置

    使用LSM6DSO16IS的ISPU的9軸數(shù)據(jù)的幾個疑問求解

    最近想使用LSM6DSO16IS extend iic hub外掛地磁,利用ispu輸出姿態(tài)角組成9軸低功耗的方案。在看了官方給的資料之后有幾個疑惑。 1.官方好像沒找到關(guān)于這種
    發(fā)表于 07-02 07:06
    主站蜘蛛池模板: 日日操天天射 | 亚洲精品456 | 18视频免费网址在线观看 | 免费深夜视频 | 特级aaa片毛片免费观看 | 深夜视频在线播放视频在线观看免费观看 | 日本3级视频 | 亚洲国产精品嫩草影院 | 国产在线h | 男人午夜网站 | 中文字幕在线第一页 | 九色福利 | 亚洲一区二区中文 | bt天堂资源在线官网bt | 亚洲第一免费播放区 | 久久五月天婷婷 | 丁香花的视频免费观看 | 清纯唯美亚洲综合一区 | 在线伊人网 | 日韩免费观看的一级毛片 | 亚洲综合第一区 | aa黄色片| 人人做人人爽久久久精品 | 日本高清中文字幕在线观穿线视频 | 午夜性福| 成人国产三级在线播放 | 性做久久久久久久 | 免费一区二区视频 | 天天色影院 | 色婷婷5月 | 日本不卡在线一区二区三区视频 | 不卡视频一区 | 福利视频欧美 | 女人张开腿双腿让男人桶 | 手机看片欧美日韩 | 亚洲网站免费观看 | 视频h在线| 欧美日韩中文字幕在线 | 午夜视频一区二区 | 久久免费视频99 | 天天干天天爱天天操 |