鍍金池/ 教程/ 大數(shù)據(jù)/ 索引表模式
索引表模式
Sharding 分片模式
外部配置存儲(chǔ)模式
命令和查詢職責(zé)分離(CQRS)模式
靜態(tài)內(nèi)容托管模式
運(yùn)行重構(gòu)模式
計(jì)算資源整合模式
Throttling 節(jié)流模式
斷路器模式
事件獲取模式
實(shí)體化視圖模式
緩存預(yù)留模式
守門員模式
聯(lián)合身份模式
補(bǔ)償交易模式
重試模式
領(lǐng)導(dǎo)人選舉模式
優(yōu)先級(jí)隊(duì)列模式
健康端點(diǎn)監(jiān)控模式
消費(fèi)者的競(jìng)爭(zhēng)模式
基于隊(duì)列的負(fù)載均衡模式
仆人鍵模式
管道和過(guò)濾器模式
調(diào)度程序代理管理者模式

索引表模式

創(chuàng)建索引過(guò)的被查詢條件經(jīng)常被引用的數(shù)據(jù)存儲(chǔ)等領(lǐng)域。這種模式可以通過(guò)允許應(yīng)用程序更快速地定位數(shù)據(jù)來(lái)從數(shù)據(jù)存儲(chǔ)中檢索提高查詢性能。

背景和問(wèn)題

許多數(shù)據(jù)存儲(chǔ)通過(guò)使用主鍵組織為實(shí)體的集合的數(shù)據(jù)。應(yīng)用程序可以使用此鍵來(lái)查找和檢索數(shù)據(jù)。圖 1 顯示了一個(gè)數(shù)據(jù)存儲(chǔ)區(qū)保持顧客的信息的例子。主鍵是客戶 ID。

http://wiki.jikexueyuan.com/project/cloud-design-patterns/images/its.png" alt="" />

圖1 - 按主鍵組織的客戶信息(客戶ID)

而主鍵是該取基于該關(guān)鍵字的值的數(shù)據(jù)的查詢寶貴的,應(yīng)用程序可能不能夠使用主鍵是否需要基于其它字段來(lái)檢索數(shù)據(jù)。在顧客例如,應(yīng)用程序不能使用該客戶ID主鍵來(lái)檢索客戶,如果它通過(guò)指定引用的一些其他屬性的值,如在其中客戶位于鎮(zhèn)標(biāo)準(zhǔn)查詢數(shù)據(jù)完全。要執(zhí)行一個(gè)查詢,如這可能需要申請(qǐng)獲取并檢查每一個(gè)客戶的記錄,這可能是一個(gè)緩慢的過(guò)程。

許多關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)支持二級(jí)索引。一種二次指數(shù)是由一個(gè)或多個(gè)非主(輔助)鍵領(lǐng)域舉辦一個(gè)單獨(dú)的數(shù)據(jù)結(jié)構(gòu),它表示,其中每個(gè)索引值的數(shù)據(jù)被存儲(chǔ)。在一第二索引的項(xiàng)目通常排序方法的第二個(gè)鍵的值,使數(shù)據(jù)的快速查找。這些指標(biāo)通常是由數(shù)據(jù)庫(kù)管理系統(tǒng)自動(dòng)進(jìn)行維護(hù)。

由于需要支持您的應(yīng)用程序執(zhí)行不同的查詢,您可以創(chuàng)建任意多個(gè)二級(jí)指標(biāo)。例如,在一個(gè)關(guān)系數(shù)據(jù)庫(kù)中凡客ID是主鍵的表的客戶,也可能是有益的補(bǔ)充輔助指數(shù)在鎮(zhèn)域如果應(yīng)用程序頻繁查找的客戶在其居住的小鎮(zhèn)。

然而,盡管二級(jí)指標(biāo)是關(guān)系型系統(tǒng)的共同特征,使用云應(yīng)用大部分NoSQL數(shù)據(jù)存儲(chǔ)不提供同等的功能。

解決方案

如果數(shù)據(jù)存儲(chǔ)不支持??二級(jí)索引,你可以通過(guò)創(chuàng)建自己的索引表手動(dòng)效仿他們。索引表由指定的鍵組織數(shù)據(jù)。三種策略通常用于構(gòu)建一個(gè)索引表,這取決于所需要的二次索引的數(shù)目和該應(yīng)用程序執(zhí)行的查詢的性質(zhì):

重復(fù)數(shù)據(jù)的每個(gè)索引表中,而是由不同的密鑰(完全非規(guī)范化)組織它。圖2顯示了索引表的組織包括城市和姓氏相同的客戶信息:

http://wiki.jikexueyuan.com/project/cloud-design-patterns/images/its1.png" alt="" />

圖2 - 索引表執(zhí)行二級(jí)指標(biāo)的客戶數(shù)據(jù)。數(shù)據(jù)被復(fù)制到每個(gè)索引表中。

如果比較的時(shí)候,它是通過(guò)使用每個(gè)鍵查詢的數(shù)目的數(shù)據(jù)是相對(duì)靜態(tài)的這一策略可能是適當(dāng)?shù)?。如果?shù)據(jù)是更加動(dòng)態(tài),保持每個(gè)索引表的處理開(kāi)銷可能會(huì)變得太大,這種方法是有用的。此外,如果數(shù)據(jù)量非常大,空間來(lái)存儲(chǔ)重復(fù)的數(shù)據(jù)所需要的量將顯著。

創(chuàng)建由不同的密鑰組織的歸索引表和通過(guò)使用主鍵而不是重復(fù)它引用原始數(shù)據(jù),如示于圖3中的原始數(shù)據(jù)被稱為一個(gè)事實(shí)表:

http://wiki.jikexueyuan.com/project/cloud-design-patterns/images/its2.png" alt="" />

圖3 - 索引表執(zhí)行二級(jí)指標(biāo)的客戶數(shù)據(jù)。該數(shù)據(jù)是由每個(gè)索引表所引用。

這種技術(shù)可以節(jié)省空間,降低了維護(hù)的重復(fù)數(shù)據(jù)的開(kāi)銷。的缺點(diǎn)是,一個(gè)應(yīng)用程序具有通過(guò)使用第二密鑰來(lái)執(zhí)行兩個(gè)查找操作以查找數(shù)據(jù)(找到的主鍵的索引表中的數(shù)據(jù),然后查找在事實(shí)表中的數(shù)據(jù)通過(guò)使用主鍵)。

創(chuàng)建由重復(fù)的頻繁檢索的字段不同的按鍵組織的部分歸索引表。引用原始數(shù)據(jù)來(lái)訪問(wèn)較少頻繁訪問(wèn)的字段。圖4示出了這種結(jié)構(gòu)。

http://wiki.jikexueyuan.com/project/cloud-design-patterns/images/its3.png" alt="" />

圖4 - 索引表執(zhí)行二級(jí)指標(biāo)的客戶數(shù)據(jù)。經(jīng)常訪問(wèn)的數(shù)據(jù)是重復(fù)的每個(gè)索引表中。

使用這種技術(shù),你可以前兩種方法之間取得平衡??梢钥焖俚貦z索到通過(guò)使用單個(gè)查找,常用的查詢數(shù)據(jù),而空間和維護(hù)開(kāi)銷是不一樣大,復(fù)制整個(gè)數(shù)據(jù)集。

如果應(yīng)用程序通過(guò)指定值的組合頻繁地查詢數(shù)據(jù)(例如,“查找生活在雷德蒙和具有史密斯的姓所有客戶”),則可以實(shí)現(xiàn)鍵的索引表中的項(xiàng)目作為一個(gè)級(jí)聯(lián)城市屬性和姓氏屬性的,如示于圖5中的鍵由鎮(zhèn)排序,然后通過(guò)名字為那些具有鎮(zhèn)相同的值的記錄。

http://wiki.jikexueyuan.com/project/cloud-design-patterns/images/its4.png" alt="" />

圖5 - 基于復(fù)合主鍵索引表

索引表可以加快了分片的數(shù)據(jù)查詢操作,并在那里的碎片密鑰散列特別有用。圖 6 顯示了一個(gè)示例,其中分片密鑰是客戶 ID 的散列。索引表可以由非散列值(城市和名字)組織數(shù)據(jù),并提供該哈希分片鍵作為查找數(shù)據(jù)。這樣可以節(jié)省從重復(fù)計(jì)算散列鍵的應(yīng)用(其可以是昂貴的操作),如果它需要檢索的數(shù)據(jù)落在一個(gè)范圍之內(nèi),或者它需要讀取的數(shù)據(jù),以便在非散列密鑰。例如,諸如“查找生活在雷德蒙所有客戶”可以由通過(guò)定位在索引表中的匹配項(xiàng)(其全部存儲(chǔ)在一個(gè)連續(xù)的塊),并按照引用的客戶數(shù)據(jù)盡快解決的查詢使用存儲(chǔ)在索引表中的碎片的鍵。

http://wiki.jikexueyuan.com/project/cloud-design-patterns/images/its5.png" alt="" />

圖6 - 索引表中提供了快速查找的分片數(shù)據(jù)

問(wèn)題和注意事項(xiàng)

在決定如何實(shí)現(xiàn)這個(gè)模式時(shí),請(qǐng)考慮以下幾點(diǎn):

  • 保持輔助索引的開(kāi)銷可能是顯著。你必須分析和了解,您的應(yīng)用程序使用的查詢。只創(chuàng)建他們很可能被經(jīng)常使用的索引表。不要投機(jī)創(chuàng)建索引的表,以支持應(yīng)用程序不執(zhí)行查詢,或者一個(gè)應(yīng)用程序只執(zhí)行非常偶然。
  • 在索引表中復(fù)制的數(shù)據(jù)所用的存儲(chǔ)成本和維護(hù)數(shù)據(jù)的多個(gè)副本所需的工作條件添加顯著開(kāi)銷。
  • 執(zhí)行一個(gè)索引表,作為標(biāo)準(zhǔn)化的結(jié)構(gòu),引用原始數(shù)據(jù)可能需要的應(yīng)用程序,以執(zhí)行兩個(gè)查找操作以查找數(shù)據(jù)。第一操作搜索索引表來(lái)檢索主鍵,第二個(gè)使用的主密鑰來(lái)獲取數(shù)據(jù)。
  • 如果系統(tǒng)包含大量索引表在非常大的數(shù)據(jù)集,也可以是難以維持索引表和原始數(shù)據(jù)之間的一致性。有可能設(shè)計(jì)圍繞最終一致性模型的應(yīng)用。例如,插入,更新或刪除數(shù)據(jù),一個(gè)應(yīng)用程序可以發(fā)送一條消息給一個(gè)隊(duì)列,并讓一個(gè)獨(dú)立的任務(wù)執(zhí)行操作和維護(hù)引用該數(shù)據(jù)不同步的索引表。有關(guān)實(shí)現(xiàn)最終一致性的更多信息,請(qǐng)參閱數(shù)據(jù)一致性底漆。

注意: 微軟 Azure 存儲(chǔ)表支持事務(wù)更新到同一個(gè)分區(qū)中保存的數(shù)據(jù)進(jìn)行更改(簡(jiǎn)稱實(shí)體組的事務(wù))。如果你可以存儲(chǔ)一個(gè)事實(shí)表和在同一個(gè)分區(qū)的一個(gè)或多個(gè)索引表中的數(shù)據(jù),您可以使用此功能來(lái)幫助確保一致性。

索引表可以自行進(jìn)行分區(qū)或分片。

何時(shí)使用這個(gè)模式

使用這種模式來(lái)提高查詢性能,當(dāng)應(yīng)用程序經(jīng)常需要使用一鍵以外的主(或子庫(kù))鍵來(lái)檢索數(shù)據(jù)。

這種模式可能不適合時(shí):

  • 數(shù)據(jù)是不穩(wěn)定的。索引表可能變得過(guò)時(shí)的速度非???,使其無(wú)效,或者使保持在索引表大于用它制成的任何節(jié)省的開(kāi)銷。
  • 選作索引表中的二級(jí)密鑰的場(chǎng)是非常不鑒別,只能有一個(gè)小的值的集合(例如,性別)。
  • 數(shù)據(jù)值的選擇為一個(gè)索引表中的二級(jí)密鑰的場(chǎng)的平衡是高度傾斜。例如,如果 90% 的記錄中包含相同的值中的一個(gè)字段,然后創(chuàng)建和維護(hù)一個(gè)索引表中查找基于該字段中的數(shù)據(jù)可以施加更大的開(kāi)銷比通過(guò)數(shù)據(jù)掃描順序。然而,如果查詢非常頻繁地針對(duì)位于對(duì)剩余的 10% 的值,該索引可以是有用的。你必須明白的疑問(wèn),您的應(yīng)用程序正在執(zhí)行,以及如何他們經(jīng)常執(zhí)行。

例子

Azure 存儲(chǔ)表在云中運(yùn)行的應(yīng)用程序提供了一個(gè)高度可擴(kuò)展的鍵/值數(shù)據(jù)存儲(chǔ)。應(yīng)用程序存儲(chǔ),并通過(guò)指定一個(gè)鍵檢索數(shù)據(jù)值。的數(shù)據(jù)值可以包含多個(gè)字段,但一個(gè)數(shù)據(jù)項(xiàng)的結(jié)構(gòu)是不透明的表存儲(chǔ),這僅僅處理一個(gè)數(shù)據(jù)項(xiàng)作為一個(gè)字節(jié)數(shù)組。

Azure 存儲(chǔ)表還支持分片。分片密鑰包括兩個(gè)元件,一個(gè)分區(qū)鍵和行密鑰。有相同的分區(qū)鍵的數(shù)據(jù)項(xiàng)都存儲(chǔ)在同一分區(qū)(碎片),并且項(xiàng)目被存儲(chǔ)在一個(gè)子庫(kù)中排鍵順序。表存儲(chǔ)優(yōu)化用于執(zhí)行獲取數(shù)據(jù)下降分區(qū)中的連續(xù)范圍的行鍵值范圍內(nèi)的查詢。如果您正在構(gòu)建存儲(chǔ)在 Azure 的表的信息的云應(yīng)用,你應(yīng)該組織你的數(shù)據(jù)在考慮這個(gè)功能。

例如,考慮存儲(chǔ)有關(guān)電影的信息的應(yīng)用程序。應(yīng)用程序經(jīng)常按流派查詢電影(動(dòng)作片,紀(jì)錄片,歷史,喜劇,戲劇,等等)??梢酝ㄟ^(guò)使用類型作為分區(qū)鍵,并指定電影的名稱作為行密鑰創(chuàng)建一個(gè)天青表的分區(qū)的每個(gè)類型,如圖7。

http://wiki.jikexueyuan.com/project/cloud-design-patterns/images/its6.png" alt="" />

圖7 - 存儲(chǔ)在 Azure Table 中的電影數(shù)據(jù),按流派劃分和排序的電影名稱

這種方法不太有效,如果該應(yīng)用程序還需要通過(guò)演員主演查詢電影。在這種情況下,你可以創(chuàng)建一個(gè)單獨(dú)的Azure表作為一個(gè)索引表。分區(qū)鍵是演員和行關(guān)鍵是電影的名字。對(duì)于每個(gè)演員的數(shù)據(jù)將被存儲(chǔ)在單獨(dú)的分區(qū)。如果一個(gè)電影明星不止一個(gè)演員,同一部電影會(huì)出現(xiàn)在多個(gè)分區(qū)。

可以通過(guò)采用上面的解決方案部分中所述的第一種方式重復(fù)在每個(gè)分區(qū)中保存的值的電影數(shù)據(jù)。然而,很可能是每個(gè)影片將(對(duì)于每個(gè)演員一次)重復(fù)幾次,所以它可能是更有效的,以部分非規(guī)范化,以支持最常見(jiàn)的查詢(如其他演員的姓名)的數(shù)據(jù),并實(shí)現(xiàn)一個(gè)應(yīng)用程序由包括必要找到在體裁分區(qū)的完整信息,分區(qū)鍵來(lái)檢索任何剩余的細(xì)節(jié)。這種方法是通過(guò)在解決方案部分中的第三項(xiàng)中的說(shuō)明。圖8描述了這種方法。

http://wiki.jikexueyuan.com/project/cloud-design-patterns/images/its7.png" alt="" />

圖8 - 演員分區(qū)作為索引表的影像數(shù)據(jù)