搜尋資料庫內部資訊和檔案格式

2021-08-19 12:34:17 字數 1396 閱讀 9157

在之前的文章中,我展示過如何用乙個簡單的基於文字格式來儲存記錄,並且對於讀/寫這些記錄又意味著什麼。在這樣乙個系統中搜尋意味著你有相當多的工作要做,因為你需要掃瞄整個檔案。

它不會真的為我們工作。所以,我們需要引入索引。索引其實是乙個很簡單的概念。鑑於我們有原始檔案,我們將有以下使用者名稱的索引:

基本上,該索引第一列的值是使用者名稱,並且這些值是排序的,所以搜尋索引有乙個o(logn)與之複雜性相關聯。一旦我們做到了,我們有記錄編號,並且我們可以用它來找到檔案中的位置和讀取整個記錄。

總的來說,這是最基本的,對吧?所以為什麼我將整篇文章圍繞這個主題?

恩,如果我們打算只做一次,索引的問題將非常簡單。但是我們想更新它們,這會導致某些問題。雖然索引上面只顯示幾個記錄,而實際的資料大小我們這裡討論的是一百萬條記錄。這給我們大約16 mb的總索引大小。如果我們需要新增乙個新使用者名稱,接下來會發生什麼?在這種情況下,乙個忠實的球迷,他的使用者名稱是「棒球」嗎?

為了維持秩序,我們不得不把它放在前兩個條目之間。這將需要我們移動其餘的相同數量的資料。實際上,為了向索引中新增乙個條目,我們不得不寫16mb。

換句話說,因為檔案不允許我們從沒有大量昂貴的i/o中間檔案中動態地新增/刪除資料,我們真的不能為此使用平面檔案。這不是乙個驚喜,但是我想從最低限度開始,並且在複雜層次結構中,我們會發現我們為什麼需要這些東西。

因此,我們需要找到乙個檔案格式,將允許我們更新的東西不用每次洗牌整個檔案。看文獻,我可以採用比較平面檔案的方法來有乙個排序陣列,並且它也存在同樣的問題。典型的解決方案是使用乙個二叉搜尋樹。通過這種方式,我們始終在檔案的開頭有樹的根,並且根據我們需要去的地方,使用偏移量在檔案中跳轉。

在這種檔案中,搜尋的**看起來像這樣︰

請注意,這裡所有的錯誤處理會被刪除,雖然它給了我們想要的,但是這種解決方案存在幾個問題。

首先,如果我們想要擁有良好的效能,我們需要在平衡樹上插入/刪除,這可能很複雜。不僅如此,這也意味著,我們實際執行檔案操作的數量是相當高的。然而這樣不是很好,因為檔案會駐留在硬體上(很慢),所以我們可能不想使用。

相反,我們需要找到一些東西可以讓我們在檔案中做更少的尋找(在標準硬碟上大約需要10-20毫秒),並能更好地處理併發工作(不會爭奪磁頭的太多位置)。我們還需要在確保工作量同時,所做的修改是最小的。在平衡樹結構中,工作量平衡它可以是非常高的,並且周圍跳轉地方的數量是令人難以置信的。

原文:the guts』n』glory of database internals: searching information and file format (譯者/孫思)

問題 資料庫內部巢狀關係實現

今天在做報表的時候遇到乙個問題,想了很長時間沒有解決,後來轉換思路一下子就解決了。具體問題是這樣的,我們公司有一張行業表,總共有四級行業需要維護,具體包括一級行業 二級行業 行業和四級行業,每個行業之間又存在包含關係,比如四級行業包含於 行業,行業包含於二級行業,二級行業包含於一級行業,最詭異的地方...

SQL Server 資料庫內部版本號

資料庫還原或版本公升級出現版本錯誤時可參考 可以利用sql語句檢視本機資料庫版本 select version 如果你不確定是源資料庫的版本,下面的對映表的sql server版本的內部版本號,以便您可以決定您需要的附加成功的最低版本 sql server version internal data...

關於XML 檔案直接匯入Mysql資料庫內容筆記

參考文件 xml 文件直接匯入mysql 中 xml文件示例 59 5960 6061 6162 62 資料庫格式要求 要把 xml 中條目記錄資料庫表中,那麼需要使得資料庫的表頭 表的列名 與xml 中條目的表示名相同,且區分大小寫。依據上面xml 文件 建立的資料庫示例 mysql create...