資料庫原理 資料庫元件概況

2021-08-07 14:41:06 字數 2914 閱讀 4865

三 陣列樹和雜湊表

時間複雜度用來檢驗某個演算法處理一定量的資料要花多長時間。

這個表示法用乙個函式來描述演算法處理給定的資料需要多少次運算。

重要的不是資料量,而是當資料量增加時運算如何增加。時間複雜度不會給出確切的運算次數,但是給出的是一種理念。

圖中可以看到不同型別的複雜度的演變過程,我用了對數尺來建這個圖。具體點兒說,資料量以很快的速度從1條增長到10億條。我們可得到如下結論: 例子

資料量低時,o(1) 和 o(n^2)的區別可以忽略不計。比如,你有個演算法要處理2000條元素。

o(1) 和 o(n^2) 的區別似乎很大(4百萬),但你最多損失 2 毫秒,只是一眨眼的功夫。確實,當今處理器每秒可處理上億次的運算。這就是為什麼效能和優化在很多it專案中不是問題。

我說過,面臨海量資料的時候,了解這個概念依然很重要。如果這一次演算法需要處理 1,000,000 條元素(這對資料庫來說也不算大)。

我沒有具體算過,但我要說,用o(n^2) 演算法的話你有時間喝杯咖啡(甚至再續一杯!)。如果在資料量後面加個0,那你就可以去睡大覺了。

合併排序有助於我們以後理解資料庫常見的聯接操作,即合併聯接

與很多有用的演算法類似,合併排序基於這樣乙個技巧:將 2 個大小為 n/2 的已排序序列合併為乙個 n 元素已排序序列僅需要 n 次操作。這個方法叫做合併。

我們用個簡單的例子來看看這是什麼意思:

通過此圖你可以看到,在 2 個 4元素序列裡你只需要迭代一次,就能構建最終的8元素已排序序列,因為兩個4元素序列已經排好序了:

1) 在兩個序列中,比較當前元素(當前=頭一次出現的第乙個)

2) 然後取出最小的元素放進8元素序列中

3) 找到(兩個)序列的下乙個元素,(比較後)取出最小的

重複1、2、3步驟,直到其中乙個序列中的最後乙個元素

然後取出另乙個序列剩餘的元素放入8元素序列中。

這個方法之所以有效,是因為兩個4元素序列都已經排好序,你不需要再『回到』序列中查詢比較。

合併排序是把問題拆分為小問題,通過解決小問題來解決最初的問題(注:這種演算法叫分治法,即『分而治之、各個擊破』)。如果你不懂,不用擔心,我第一次接觸時也不懂。如果能幫助你理解的話,我認為這個演算法是個兩步演算法:

在拆分階段過程中,使用3個步驟將序列分為一元序列。步驟數量的值是 log(n) (因為 n=8, log(n)=3)。

在排序階段,你從一元序列開始。在每乙個步驟中,你應用多次合併操作,成本一共是 n=8 次運算。

第一步,4 次合併,每次成本是 2 次運算。

第二步,2 次合併,每次成本是 4 次運算。

第三步,1 次合併,成本是 8 次運算。

因為有 log(n) 個步驟,整體成本是 n*log(n) 次運算。

二維陣列是最簡單的資料結構。乙個表可以看作是個陣列,比如:

這個二維陣列是帶有行與列的表:

雖然用這個方法儲存和視覺化資料很棒,但是當你要查詢特定的值它就很糟糕了。 舉個例子,如果你要找到所有在 uk 工作的人,你必須檢視每一行以判斷該行是否屬於 uk 。這會造成 n 次運算的成本(n 等於行數),還不賴嘛,但是有沒有更快的方法呢?這時候樹就可以登場了(或開始起作用了)

二叉查詢樹是帶有特殊屬性的二叉樹,每個節點的關鍵字必須:

比儲存在左子樹的任何鍵值都要大

比儲存在右子樹的任何鍵值都要小

b+樹索引

查詢乙個特定值這個樹挺好用,但是當你需要查詢兩個值之間的多個元素時,就會有**煩了。你的成本將是 o(n),因為你必須查詢樹的每乙個節點,以判斷它是否處於那 2 個值之間(例如,對樹使用中序遍歷)。而且這個操作不是磁碟i/o有利的,因為你必須讀取整個樹。我們需要找到高效的範圍查詢方法。為了解決這個問題,現代資料庫使用了一種修訂版的樹,叫做b+樹。在乙個b+樹里:

我們最後乙個重要的資料結構是雜湊表。當你想快速查詢值時,雜湊表是非常有用的。而且,理解雜湊表會幫助我們接下來理解乙個資料庫常見的聯接操作,叫做『雜湊聯接』。這個資料結構也被資料庫用來儲存一些內部的東西(比如鎖表或者緩衝池,我們在下文會研究這兩個概念)。

雜湊表這種資料結構可以用關鍵字來快速找到乙個元素。為了構建乙個雜湊表,你需要定義:

元素的關鍵字

這個雜湊表有10個雜湊桶。因為我懶,我只給出5個桶,但是我知道你很聰明,所以我讓你想象其它的5個桶。我用的雜湊函式是關鍵字對10取模,也就是我只保留元素關鍵字的最後一位,用來查詢它的雜湊桶:

比方說你要找元素 78:

雜湊表計算 78 的雜湊碼,等於 8。

查詢雜湊桶 8,找到的第乙個元素是 78。

返回元素 78。

查詢僅耗費了 2 次運算(1次計算雜湊值,另一次在雜湊桶中查詢元素)。

現在,比方說你要找元素 59:

雜湊表計算 59 的雜湊碼,等於9。

查詢雜湊桶 9,第乙個找到的元素是 99。因為 99 不等於 59, 那麼 99 不是正確的元素。

用同樣的邏輯,查詢第二個元素(9),第三個(79),……,最後乙個(29)。

元素不存在。

搜尋耗費了 7 次運算。

資料庫 資料庫索引原理

正確的建立合適的索引 是提公升資料庫查詢效能的基礎 4.b tree 在兩大引擎中的體現 5.索引的原則 索引是為了加速對錶中資料行的檢索而建立的一種分散儲存的資料結構。索引能極大的減少儲存引擎需要掃瞄的資料量 索引可以把隨機io變成順序io 索引可以幫助我們在進行分組 排序等操作時,避免使 用臨時...

資料庫原理

基本內容 acid與cap 資料庫事務可能引發的問題 資料庫鎖的型別 封鎖協議 兩段鎖協議 資料庫隔離級別 mvcc的實現步驟 mysql事務如何實現 資料庫鎖如何實現 xa兩段提交協議。1.acid是資料庫事務正確執行的四個基本要素 原子性 事務是資料庫併發控制的最小單位,要麼全部提交成功,要麼全...

資料庫原理

資料庫是乙個以某種有組織的方式儲存的資料集合。也就是 儲存有組織資料的容器 乙個檔案或一組檔案 儲存資料的工具,或者說是儲存資料的集合,結構為 模式 內模式 外模式,由dbms 資料庫作業系統 來控制,達到管理資料的目的 特點 兩大資料模型 注 關係與非關聯式資料庫 資料庫三層次 我們要將資料存放到...