最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【StoneDB Class】入門(mén)第二課:StoneDB 整體架構(gòu)解析

2023-07-17 17:33 作者:StoneDB  | 我要投稿

今天的課程主要為大家講解 StoneDB 的整體架構(gòu),我們先來(lái)看一下架構(gòu)圖:

如上圖所示,StoneDB 的整體架構(gòu)分為三層,分別是應(yīng)用層、服務(wù)層和存儲(chǔ)引擎層。應(yīng)用層主要負(fù)責(zé)客戶(hù)端的連接管理和權(quán)限驗(yàn)證;服務(wù)層提供了 SQL 接口、查詢(xún)緩存、解析器、優(yōu)化器、執(zhí)行器等組件;Tianmu 引擎所在的存儲(chǔ)引擎層是 StoneDB 的核心,數(shù)據(jù)的組織和壓縮、以及基于知識(shí)網(wǎng)格的查詢(xún)優(yōu)化均是在 Tianmu 引擎實(shí)現(xiàn)。下面為大家詳細(xì)介紹 StoneDB 整體架構(gòu)中的主要特性。



列式存儲(chǔ)

StoneDB 創(chuàng)建的表在磁盤(pán)上是以列模式進(jìn)行存儲(chǔ)的,由于關(guān)系型數(shù)據(jù)庫(kù)中每一列的數(shù)據(jù)類(lèi)型都相同,所以這種連續(xù)的空間存儲(chǔ)與行式存儲(chǔ)相比,更加能夠?qū)崿F(xiàn)數(shù)據(jù)的高壓縮比。在讀取數(shù)據(jù)方面,如果只想查詢(xún)一個(gè)字段的結(jié)果,在行式存儲(chǔ)中,引擎層向服務(wù)層返回的是一整行的數(shù)據(jù),需要消耗更多的網(wǎng)絡(luò)帶寬和 IO。而列式存儲(chǔ)只需要返回一個(gè)字段,極大減少了網(wǎng)絡(luò)帶寬和 IO 的消耗。另外,列式存儲(chǔ)無(wú)需再為列創(chuàng)建索引和維護(hù)索引。

數(shù)據(jù)壓縮

上面提到同一數(shù)據(jù)類(lèi)型的列存儲(chǔ)在一起,能夠?qū)崿F(xiàn)數(shù)據(jù)的高壓縮比。StoneDB 會(huì)根據(jù)不同的數(shù)據(jù)類(lèi)型選擇不同的壓縮算法,目前支持的壓縮算法主要有 PPM、LZ4、B2、Delta 等。數(shù)據(jù)被壓縮后,數(shù)據(jù)量變得更小,在讀取數(shù)據(jù)時(shí),對(duì)網(wǎng)絡(luò)帶寬和磁盤(pán) IO 的壓力也就越小。由于列式存儲(chǔ)相比行式存儲(chǔ)有十倍甚至更高的壓縮比,StoneDB 可以節(jié)省大量的存儲(chǔ)空間,降低存儲(chǔ)成本。

知識(shí)網(wǎng)格管理

當(dāng)表的數(shù)據(jù)量達(dá)到千萬(wàn)、億級(jí),在做統(tǒng)計(jì)分析類(lèi)查詢(xún)時(shí),使用 MySQL 的 InnoDB 存儲(chǔ)引擎或其它關(guān)系型數(shù)據(jù)庫(kù)的行式存儲(chǔ)引擎可能需要幾分鐘到幾十分鐘才能得到結(jié)果集。這是因?yàn)榛诔杀镜膬?yōu)化器需要根據(jù)表或者索引的統(tǒng)計(jì)信息生成執(zhí)行計(jì)劃,然后再去讀取數(shù)據(jù),中間過(guò)程會(huì)發(fā)生 IO,如果統(tǒng)計(jì)信息不準(zhǔn),生成了一個(gè)錯(cuò)誤的執(zhí)行計(jì)劃,那么可能會(huì)發(fā)生更多的 IO。而 StoneDB 的 Tianmu 引擎在相同的數(shù)據(jù)量下,比 MySQL 的 InnoDB 存儲(chǔ)引擎或或其它關(guān)系型數(shù)據(jù)庫(kù)的行式存儲(chǔ)引擎要快數(shù)十倍。Tianmu 引擎除了列式存儲(chǔ)、數(shù)據(jù)壓縮特性外,還有知識(shí)網(wǎng)格技術(shù)。在了解知識(shí)網(wǎng)格前,需要了解以下幾個(gè)基本概念。

Data Pack

數(shù)據(jù)包用于存放實(shí)際數(shù)據(jù),是最底層的數(shù)據(jù)存儲(chǔ)單元,每列按照65536行切分成一個(gè)數(shù)據(jù)包。每個(gè)數(shù)據(jù)包比列更小,具有更高的壓縮比,而每個(gè)數(shù)據(jù)包又比每行更大,具有更好的查詢(xún)性能。數(shù)據(jù)包是知識(shí)網(wǎng)格的解壓縮單元。

粗糙集是一門(mén)數(shù)學(xué)學(xué)科,用來(lái)研究不完整的數(shù)據(jù),不精確的知識(shí)表達(dá)、學(xué)習(xí)、歸納等的一套理論。在 StoneDB 中,粗糙集用于對(duì)數(shù)據(jù)包的劃分,根據(jù) SQL 的查詢(xún)條件的數(shù)據(jù)在數(shù)據(jù)包中的確認(rèn)范圍,數(shù)據(jù)包分為以下幾類(lèi):

1)不相關(guān)的數(shù)據(jù)包:表示不滿足查詢(xún)條件的數(shù)據(jù)包,這類(lèi)數(shù)據(jù)包直接被忽略。

2)相關(guān)的數(shù)據(jù)包:表示滿足查詢(xún)條件的數(shù)據(jù)包,如果要查詢(xún)相關(guān)的數(shù)據(jù)包里面的具體數(shù)據(jù),需要對(duì)數(shù)據(jù)包進(jìn)行解壓縮,如果根據(jù)數(shù)據(jù)包的元數(shù)據(jù)節(jié)點(diǎn)就能得到數(shù)據(jù),那么就不需要解壓縮數(shù)據(jù)包。

3)可疑的數(shù)據(jù)包:表示數(shù)據(jù)包中的數(shù)據(jù)部分滿足查詢(xún)條件,需要進(jìn)一步解壓縮數(shù)據(jù)包才能得到滿足條件的數(shù)據(jù)。

Metadata Node

元數(shù)據(jù)節(jié)點(diǎn)記錄了每個(gè)數(shù)據(jù)包中列的最大值、最小值、平均值、總和、總記錄數(shù)、null 值的數(shù)量、壓縮方式、占用的字節(jié)數(shù)。每一個(gè)元數(shù)據(jù)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)數(shù)據(jù)包。

Knowledge Node

元數(shù)據(jù)節(jié)點(diǎn)的上一層是知識(shí)節(jié)點(diǎn),除了記錄數(shù)據(jù)包之間或者列之間關(guān)系的元數(shù)據(jù)集合,比如數(shù)據(jù)包的最小值與最大值范圍、列之間的關(guān)聯(lián)關(guān)系外,還記錄了數(shù)據(jù)特征以及更深度的統(tǒng)計(jì)信息。大部分的知識(shí)節(jié)點(diǎn)數(shù)據(jù)是裝載數(shù)據(jù)的時(shí)候產(chǎn)生的,另外一部分是查詢(xún)的時(shí)候產(chǎn)生的。

知識(shí)節(jié)點(diǎn)的3種基本類(lèi)型:

1)Histogram

數(shù)據(jù)類(lèi)型為整型、日期型、浮點(diǎn)型的列的統(tǒng)計(jì)值以直方圖的形式存在。將一個(gè)數(shù)據(jù)包的最小值到最大值之間分為1024段,每段占用一個(gè) bit,如果數(shù)據(jù)包中的實(shí)際值處于段中的范圍,則標(biāo)記為1,否則標(biāo)記為0。Histogam 在數(shù)據(jù)被加載時(shí)自動(dòng)創(chuàng)建。

如下的例子中,說(shuō)明數(shù)據(jù)包中有值落在0~100和102301~102400兩個(gè)區(qū)間。



select?*?from?table?where?id>199?and?id<299;

通過(guò)直方圖可知,這個(gè)查詢(xún)沒(méi)有在這個(gè)數(shù)據(jù)包命中,即當(dāng)前數(shù)據(jù)包不滿足查詢(xún)條件,這個(gè)數(shù)據(jù)包直接被丟棄。

2)Character Map

數(shù)據(jù)類(lèi)型為字符串的列的字符映射表。統(tǒng)計(jì)當(dāng)前數(shù)據(jù)包內(nèi) 1~64 長(zhǎng)度中 ASCII 字符是否存在。如果存在,則標(biāo)記為1,否則標(biāo)記為0。字符檢索時(shí),按照字符順序依次對(duì)比字符標(biāo)識(shí)值即可知道該數(shù)據(jù)包是否包含匹配數(shù)據(jù)。Character Map 在數(shù)據(jù)被加載時(shí)自動(dòng)創(chuàng)建。

如下的例子中,說(shuō)明 A 在字符串的第1個(gè)和第64個(gè)位置。



包對(duì)包關(guān)系表示不同表的兩個(gè)列之間的等值映射表,并以二進(jìn)制矩陣的形式進(jìn)行存儲(chǔ),如果符合表關(guān)聯(lián)條件,則標(biāo)記為1,否則標(biāo)記為0。包對(duì)包關(guān)系能幫助在表關(guān)聯(lián)查詢(xún)的時(shí)候快速判斷出符合查詢(xún)條件的數(shù)據(jù)包,從而提升表關(guān)聯(lián)查詢(xún)的效率。表關(guān)聯(lián)查詢(xún)時(shí),Pack to Pack 被自動(dòng)創(chuàng)建。

如下的例子中,表關(guān)聯(lián)的查詢(xún)條件是"A.C=B.D",在 A.C1 這個(gè)數(shù)據(jù)包中,只有 B.D2 和 B.D5 這兩個(gè)數(shù)據(jù)包中有符合表關(guān)聯(lián)條件的值。



Knowledge Grid

知識(shí)網(wǎng)格由元數(shù)據(jù)節(jié)點(diǎn)和知識(shí)節(jié)點(diǎn)組成,在做統(tǒng)計(jì)分析類(lèi)查詢(xún)時(shí),StoneDB 根據(jù)知識(shí)網(wǎng)格技術(shù)過(guò)濾掉不相關(guān)的數(shù)據(jù)包,如果只剩下相關(guān)數(shù)據(jù)包,那么只需要讀取元數(shù)據(jù)就能返回查詢(xún)結(jié)果。這樣就消除了解壓縮數(shù)據(jù)包的過(guò)程和降低 IO 消耗,提高了查詢(xún)響應(yīng)時(shí)間和網(wǎng)絡(luò)利用率。


接下來(lái),我們通過(guò)一個(gè)例子來(lái)理解一個(gè)查詢(xún)語(yǔ)句在存儲(chǔ)引擎層使用知識(shí)網(wǎng)格技術(shù)的查詢(xún)優(yōu)化過(guò)程。


有如下的查詢(xún)語(yǔ)句和數(shù)據(jù)包節(jié)點(diǎn)的數(shù)據(jù)值分布范圍:

select?min(t2.D)?from?t1,t2?where?t1.B=t2.C?and?t1.A>15;

1. 根據(jù)列 A 的 DPN 可知,t1.A1 屬于不相關(guān)的數(shù)據(jù)包,t1.A2 屬于可疑的數(shù)據(jù)包,t1.A3 屬于相關(guān)的數(shù)據(jù)包,這一步就過(guò)濾掉數(shù)據(jù)包 t1.A1。

2. 第一步已經(jīng)過(guò)濾掉數(shù)據(jù)包 t1.A1,這一步就不需要對(duì) t1.B1 和 t2.C1 做關(guān)聯(lián)對(duì)比,根據(jù)包對(duì)包關(guān)系的映射表可知,這一步過(guò)濾掉數(shù)據(jù)包 t2.C3 和 t2.C4。那么滿足關(guān)聯(lián)條件的數(shù)據(jù)包有 t2.C2 和 t2.C5。


3. 第一步和第二步已經(jīng)過(guò)濾掉 D1、D3、D4,那么只剩下 D2 和D5,根據(jù)列 D 的 DPN 可知,D5 的最大值100小于 D2 的最小值101,這一步過(guò)濾掉數(shù)據(jù)包 D2。最后只剩下數(shù)據(jù)包 D5,根據(jù)元數(shù)據(jù)得到 D5 的最小值3。

高性能導(dǎo)入

StoneDB 提供獨(dú)立的數(shù)據(jù)導(dǎo)入客戶(hù)端,支持不同的數(shù)據(jù)源環(huán)境,支持多語(yǔ)言架構(gòu)。數(shù)據(jù)在導(dǎo)入前,首先會(huì)進(jìn)行預(yù)處理,如數(shù)據(jù)壓縮和知識(shí)節(jié)點(diǎn)的構(gòu)建。數(shù)據(jù)經(jīng)過(guò)預(yù)處理后,進(jìn)入存儲(chǔ)引擎無(wú)需再次執(zhí)行解析、數(shù)據(jù)驗(yàn)證以及事務(wù)處理等操作。


以上是本次課程的全部?jī)?nèi)容,下節(jié)課我們將帶大家學(xué)習(xí) StoneDB 的安裝部署和手動(dòng)編譯。如果您對(duì) StoneDB 感興趣,可以通過(guò)下方鏈接查看 StoneDB 源碼、閱讀文檔,期待您的貢獻(xiàn)!


StoneDB 開(kāi)源倉(cāng)庫(kù)

https://github.com/stoneatom/stonedb


END

【StoneDB Class】入門(mén)第二課:StoneDB 整體架構(gòu)解析的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
阜宁县| 神池县| 佛山市| 金塔县| 卢湾区| 嘉荫县| 通州区| 称多县| 怀化市| 锡林郭勒盟| 威信县| 潜江市| 静海县| 普兰县| 高青县| 禄劝| 滕州市| 抚顺县| 瓦房店市| 大姚县| 乌拉特后旗| 馆陶县| 南澳县| 东乌| 苍南县| 鹤庆县| 龙南县| 合作市| 蓬莱市| 梁河县| 唐山市| 平潭县| 石渠县| 泽普县| 乐亭县| 贵德县| 科尔| 合阳县| 离岛区| 岳普湖县| 江陵县|