第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

鍵/值數(shù)據(jù)庫的二級(jí)索引

鍵/值數(shù)據(jù)庫的二級(jí)索引

Go
幕布斯7119047 2023-06-05 17:11:32
比方說,我有這樣的數(shù)據(jù)結(jié)構(gòu) type User struct {      UUid string       Username string      Email String       Password string       FirstName string       LastName string}我將 Users []User 存儲(chǔ)到 levelDB 中的鍵/值數(shù)據(jù)庫中。唯一鍵將是 UUid,然后用戶結(jié)構(gòu)將根據(jù)此 UUID 進(jìn)行編碼和存儲(chǔ)。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,我想在電子郵件上創(chuàng)建二級(jí)索引,這樣我就不必掃描數(shù)據(jù)庫中存在的所有條目來查找與電子郵件對(duì)應(yīng)的特定條目。我做了什么:我創(chuàng)建了一個(gè)名為 SIndex 的鍵,并在其中存儲(chǔ)了一個(gè) map[string][string] 數(shù)據(jù)結(jié)構(gòu),其中鍵是電子郵件,值是 uuid。每次有新條目進(jìn)入時(shí),此 Sindex 都會(huì)更新以適應(yīng)新的 uuid 和電子郵件。這是一個(gè)糟糕的方法:因?yàn)殡S著數(shù)據(jù)的增長,需要獲取和解碼對(duì)應(yīng)于 Sindex 的整個(gè)地圖,如果電子郵件不存在,則向 Sindex 添加一個(gè)新密鑰,對(duì)其進(jìn)行編碼并再次存儲(chǔ)。B樹會(huì)更適合。我的問題:在數(shù)據(jù)庫本身中存儲(chǔ)二級(jí)索引數(shù)據(jù)是否正確,如果不是,我應(yīng)該使用什么策略來實(shí)現(xiàn)二級(jí)索引,我知道二級(jí)索引的選擇受數(shù)據(jù)的影響很大但是有沒有好的開箱即用索引B-Tree、HashMaps 以外的算法?
查看完整描述

1 回答

?
Qyouu

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊

將二級(jí)索引數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫本身是否正確

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

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

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

反正B-Tree和HashMap是數(shù)據(jù)結(jié)構(gòu),不是算法。而您實(shí)際上所做的并不是使用 HashMap 進(jìn)行索引,它只是將 HashMap 存儲(chǔ)為您的鍵的值。索引通常取決于 DBMS 實(shí)現(xiàn)(我們只能從它們提供的選項(xiàng)中進(jìn)行選擇)。

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

對(duì)于您的情況,您只需要將電子郵件存儲(chǔ)為鍵,將 UUID 存儲(chǔ)為值。哈希表通常用于此。大多數(shù) DBMS 使用這種數(shù)據(jù)結(jié)構(gòu)來進(jìn)行主鍵訪問,時(shí)間復(fù)雜度僅為 O(1)。而且我相信 LevelDB 的實(shí)現(xiàn)也是基于這種數(shù)據(jù)結(jié)構(gòu)的。


查看完整回答
反對(duì) 回復(fù) 2023-06-05
  • 1 回答
  • 0 關(guān)注
  • 153 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)