亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

鍵/值數據庫的二級索引

鍵/值數據庫的二級索引

Go
幕布斯7119047 2023-06-05 17:11:32
比方說,我有這樣的數據結構 type User struct {      UUid string       Username string      Email String       Password string       FirstName string       LastName string}我將 Users []User 存儲到 levelDB 中的鍵/值數據庫中。唯一鍵將是 UUid,然后用戶結構將根據此 UUID 進行編碼和存儲。var network bytes.Buffer // Stand-in for a network connectionenc := gob.NewEncoder(&network)err := enc.Encode(user)   if err != nil {      log.Println("Error in encoding gob")      return "", err }err = dbSession.DBSession.Put([]byte(user.UserID), network.Bytes(), nil)由于所有條目的鍵都是唯一的 uuid,我想在電子郵件上創建二級索引,這樣我就不必掃描數據庫中存在的所有條目來查找與電子郵件對應的特定條目。我做了什么:我創建了一個名為 SIndex 的鍵,并在其中存儲了一個 map[string][string] 數據結構,其中鍵是電子郵件,值是 uuid。每次有新條目進入時,此 Sindex 都會更新以適應新的 uuid 和電子郵件。這是一個糟糕的方法:因為隨著數據的增長,需要獲取和解碼對應于 Sindex 的整個地圖,如果電子郵件不存在,則向 Sindex 添加一個新密鑰,對其進行編碼并再次存儲。B樹會更適合。我的問題:在數據庫本身中存儲二級索引數據是否正確,如果不是,我應該使用什么策略來實現二級索引,我知道二級索引的選擇受數據的影響很大但是有沒有好的開箱即用索引B-Tree、HashMaps 以外的算法?
查看完整描述

1 回答

?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

將二級索引數據存儲在數據庫本身是否正確

您應該將電子郵件作為鍵,將 UUID 作為值。另一種選擇是使用電子郵件作為數據庫的密鑰,而不是使用 UUID。這樣您就不需要使用二級索引。

另一種提高性能的策略,你可以使用內存數據庫,如 Redis(或者 LevelDB 本身可以用來將數據存儲在內存中)來存儲二級索引(電子郵件作為鍵,UUID 作為值)。

除了 B-Tree、HashMaps 之外,還有什么好的開箱即用的索引算法嗎?

反正B-Tree和HashMap是數據結構,不是算法。而您實際上所做的并不是使用 HashMap 進行索引,它只是將 HashMap 存儲為您的鍵的值。索引通常取決于 DBMS 實現(我們只能從它們提供的選項中進行選擇)。

所以,關于用于索引的數據結構,它是否好,真的取決于用例。例如,如果您需要進行范圍搜索,您可以使用 B-Tree(大多數 DBMS 默認使用)、B+ 樹(MySQL InnoDB 默認使用)和 Skip List(Redis 使用此數據結構進行排序放)。

對于您的情況,您只需要將電子郵件存儲為鍵,將 UUID 存儲為值。哈希表通常用于此。大多數 DBMS 使用這種數據結構來進行主鍵訪問,時間復雜度僅為 O(1)。而且我相信 LevelDB 的實現也是基于這種數據結構的。


查看完整回答
反對 回復 2023-06-05
  • 1 回答
  • 0 關注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號