從乙個簡單的例子出發,通過不同資料量的階段來看資料儲存系統的演化過程,幫助大家了解資料庫儲存系統中查詢優化的一些基本原理和思路。
例子:乙個圖書管理系統,有id, bookname, author等字段;需求是根據id來獲得書名和作者等資料。
模式一:小資料量
可以採用hashmap的形式,以id為key, bookname和author作為value;因為hashmap採用記憶體來儲存資料,結合hashmap機制,所以這種形式的資料儲存查詢速度很快。
其侷限性也很明顯:但是這種形式只適應於資料量不大的程式內資料快取或查詢使用。當資料量增加時,hashmap限制以及記憶體都會成為制約因素。
模式二:較大資料量
採用hashmap的形式,當資料量增加到超過map或記憶體的限制,hashmap的方式顯然就不再適用。這時候就可以考慮將資料記錄放入檔案中,在檔案中記錄每個id對應的bookname和author等資料, 同時在記憶體中維護乙個索引hashmap,儲存id與檔案中對應記錄的offset偏移量,因為hashmap中只儲存key和偏移量,所占用空間遠小於資料的大小,所以儲存更多的資料。
侷限性:對於單個查詢這個模式效能還是可以認可的,但是對於範圍查詢,太多的磁碟尋道造成的效能是無法是忍受的。
模式三:大資料量
當資料量繼續增大,模式二的索引資料也無法全部儲存在記憶體中時,這時候就該b+樹上場了,樹節點分為根節點、子節點和葉節點;根節點和子節點中儲存索引的範圍,葉節點儲存了id對應的資料中檔案中的offset量.
針對範圍查詢的優化
上述模式都面臨同乙個問題,無論資料結構怎麼變,都無法解決範圍查詢的低效率問題。要解決這個問題,我們需要分析磁碟的特點以及資料查詢的特點。磁碟的特點是順序讀寫速度要遠大於隨機讀寫速度,而範圍查詢一般都是連續的;所以我們的思路是將原來的隨機讀寫轉化為順序讀寫。根據這個思路,我們將磁碟上的資料進行排序和劃分page,首先進行page分割,每個page包含乙個或多個資料記錄,page與page之間是有序的,但是page內部是無序的。這樣在b+樹的葉節點就要儲存資料的page和page內的偏移量;並且磁碟讀取資料時是按照page來讀取,每次讀取一page,page是磁碟資料讀取的最小單位.
對於50-150的範圍查詢,如果資料落在多個page中,則會從磁碟上一次將資料對應的page全部讀進記憶體,因為是順序讀寫,速度近似為一次fseek。採用這種方式,範圍查詢從200次尋道減少為2兩次尋道(一次根據id找page, 一次讀取page),基本滿足了查詢的效能要求。
結束語本文只介紹了資料查詢的基本操作以及一些基本的優化處理思路,因為資料庫資料查詢效能優化是乙個非常複雜的系統,實際使用的資料庫與磁碟系統中採用了很多優化演算法來提高系統效能,有興趣的可以找一些專業的資料進行深入了解。
資料庫優化查詢與儲存原理
1 儲存引擎選擇 如果資料表需要事務處理,應該考慮使用innodb,因為它完全符合acid特性。如果不需要事務處理,使用預設儲存引擎myisam是比較明智的 2 分表分庫,主從。3 對查詢進行優化,要盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引 4 應盡量避免...
關係型資料庫工作原理 查詢優化器之雜湊連線 13
本文翻譯了如下章節,介紹資料庫查詢優化器的雜湊連線的實現原理 雜湊連線演算法更複雜,但在大多數情況下效能也比迴圈巢狀連線更優。獲取內連線表的所有元素。在記憶體中構件一張雜湊表。逐條獲取外連線表中資料。計算外連線表每條資料的雜湊值,用前面雜湊表的雜湊函式。通過雜湊值找到關聯內連線表的桶。判斷桶中是否存...
分頁查詢優化原理
利用 limit 關鍵字作分頁查詢 在實際開發中,經常需要用到分頁查詢,我們可能寫過一條如下的sql語句 select from 表1 limit m,n 表示 從m 1開始計數,查詢n條記錄出來。也有另一種寫法 select from 表1 limit n offset m 意思是 查詢n條資料,...