(轉)從對資料訪問扭曲的適應性評價PostgreSQL與InnoDB
原文作者:風輕揚
出處:http://wangyuanzju.blog.163.com/blog/static/1302920070245344752/
前兩篇文章中已經透過介紹Falcon的架構和對面向Web
2.0的儲存引擎的討論引出資料訪問扭曲這一話題,對於我接觸更多,也是最為流行的兩大開源DBMS:PostgreSQL和MySQL,自然忍不住按它
來比較一把了。由於這一問題只與DBMS的儲存系統有關,因此這裡實際上比較的是PostgreSQL與MySQL的事務型儲存引擎InnoDB。
PostgreSQL與InnoDB都採用多版本併發控制技術,但兩者在儲存的實現機制上仍然有以下兩個重大差別:
- PostgreSQL用堆儲存記錄,而InnoDB用按主鍵為鍵值的B+樹索引儲存記錄,即受限的索引組織表
- PostgreSQL公平對待一個記錄的所有索引版本,儲存是不加以區分,而InnoDB的資料儲存主體只儲存最新的版本,老版本儲存在回滾段中,類似於Oracle。
首先對比堆儲存和主鍵聚簇儲存。堆儲存的優點在於在某些情況下空間利用率會比主鍵聚簇好,因為按主鍵聚簇時記錄的儲存位置是受限的,而堆儲存時則可以利用
所有的空閒空間。正是基於這一點,大部分資料庫中堆儲存都是預設的儲存方式。但在資料訪問扭曲面前,堆儲存這一完全自由選擇記錄儲存位置的優點卻成了問
題。由於應用無法以任何方式控制記錄的儲存位置和聚簇特性,頻繁訪問的記錄在物理上的儲存連續性完全沒有保障。相對來說,主鍵聚簇儲存就使得應用對資料聚
簇特性有了一些控制權,如根據一個自增的ID聚簇就可以按將資料外掛和順序進行聚簇,對於那些最近的記錄訪問頻繁的應用(很多應用是這樣的)就利用了資料
訪問扭曲的好處;根據userid+id(實際上id完全可以唯一標識一個記錄,使用userid+id作為主鍵純粹是為了改變資料聚簇性質)聚簇就可以
將資料按使用者進行聚簇,對於那些少量使用者的記錄訪問頻繁的應用也有利(對於更新也比較頻率的應用,這一方法也會有點問題)。
PostgreSQL
不加區分的儲存所有版本的策略對利用資料訪問扭曲也是不利的。這裡先要了解一下PostgreSQL裡儲存多版本的策略。簡化來說,PostgreSQL
在每條記錄的每個版本頭部都會記錄兩個事務ID:一個是產生事務ID,一個是消亡事務ID(實際上還有兩個另兩個語句ID,用於實現低於可序列化的隔離級
別,其作用與原理與事務ID是類似的)。PostgreSQL處理多版本的簡單邏輯是這樣的:一個事務更新一個記錄時產生一個新版本,並設定新版本的產生
事務ID和和原版本的消亡事務ID為該事務ID。新舊版本除被組織成一個連結串列外,其物理儲存沒有任何其它聯絡,就好像是兩個記錄一般。事務在讀取到一個版
本時,透過這兩個事務ID與當前事務ID之間的關係來判斷它是否應該看到這個版本。這一實現策略相當簡潔(對索引的多版本儲存尤其是如此),透過索引訪問
時更不會有對回滾段的額外訪問,可以消除事務回滾的代價(在PostgreSQL中事務回滾時除將事務標識為已經回滾外,不用幹什麼事),也不會有
Oracle中繁人的回滾段大小設定問題。
然而這一實現帶來的一個問題是:資料更新不是本地(in
place)進行的,即更新產生的新版本不是替換掉原版本,而是插入在別處。等將來舊版本被回收後,就會產生一個儲存上的空洞,為提高儲存空間利用率,就
會用新資料來填補這個空洞。這就使得新插入的記錄的儲存位置更加隨機,從而更無法利用最近的記錄最常被訪問這一常見的資料訪問扭曲行為。對於update
比較頻繁的資料,PostgreSQL的這一策略是有負面引影的。
總之,從對資料訪問扭曲的適用性來看,似乎InnoDB都更勝一籌。PostgreSQL儲存層採用的兩個策略--堆儲存和資料更新的非本地性--對利用資料訪問扭曲都有不良影響。
當
然評價一個儲存引擎絕非這麼簡單的事情,很多其它的設計抉擇甚至是實現細節都會非常大的影響一個儲存引擎的效率,另外儲存引擎只是DBMS的其中一個組
件,而本文討論的資料訪問扭曲也只是資料庫應用的一個方面而已。因此PostgreSQL與MySQL仍有各自適用的場合,即便只是用作Web
2.0應用的資料庫儲存。另外說明特別說明的是PostgreSQL中資料更新的非本地性理論上只有在update操作比較多時才會有影響。很多應用大部
分是insert操作外加少量delete,update極少,這時完全不用考慮這一點。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/124805/viewspace-1024488/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (轉)面向Web 2.0的儲存引擎設想:充分利用資料訪問扭曲Web儲存引擎
- JavaScript物件的資料屬性與訪問器屬性JavaScript物件
- 深入理解物件的資料屬性與訪問器屬性物件
- 薦讀|屬性與可直接訪問的資料成員之間應該如何選
- Holer實現外網訪問PostgreSQL資料庫SQL資料庫
- 資料安全合規需要從基於角色的訪問控制邁向基於屬性的訪問控制
- Android基礎與應用 資料儲存與訪問Android
- 遠端資料庫的訪問 (轉)資料庫
- openGauss資料與PostgreSQL的差異對比SQL
- 對抗類遊戲平衡性評價與環境預測方法遊戲
- 資料資產價值評估常用方法及對比
- 控制對網站的訪問 (轉)網站
- MyBatis 查詢資料時屬性中多對一的問題(多條資料對應一條資料)MyBatis
- Django應用資料庫從MySQL到PostgreSql的遷移Django資料庫MySql
- Serverless 解惑——函式計算如何訪問 PostgreSQL 資料庫Server函式SQL資料庫
- [轉]ABAP資料型別與Java資料型別的對應關係資料型別Java
- 第50問:從連線判斷應用訪問資料庫的異常行為資料庫
- 電子商務網站評價研究與應用分析(轉)網站
- 就是這麼應對面試官的快取與資料庫一致性問題?面試快取資料庫
- 從 "垃圾 "資料到資料完整性的轉變
- 大資料下教育評價活動的多元化轉型大資料
- <轉>Oracle資料型別與.NET中的對應關係Oracle資料型別
- 資料庫訪問幾種方式對比資料庫
- 用perl訪問mysql資料庫(轉)MySql資料庫
- 透過socket訪問資料庫(轉)資料庫
- JSP訪問資料庫大全(轉)JS資料庫
- MySql資料庫C++訪問(轉)MySql資料庫C++
- 使用屬性而不是可訪問的資料成員
- 王垠對 JS 的評價JS
- 對其他團隊的評價
- Oracle 對RAW 的官方評價Oracle
- 【轉】InnoDB和MyISAM的技術資料
- postgresql遠端不能訪問 - PostgreSQL9.4.5SQL
- oracle對BLOB型別資料的操作與效能問題(轉載)Oracle型別
- PostgreSQL IP地址訪問配置SQL
- 如何限定IP訪問Oracle資料庫-轉Oracle資料庫
- Applet直接訪問資料庫 (轉)APP資料庫
- 寫一個通用資料訪問元件 (轉)元件