我們提到nosql資料庫,總是會提到它的乙個重要特性——效能好,但為什麼呢?關係型資料庫經過幾十年的發展,各種 優化工作已經做得很深了,nosql系統一般都是吸收關係型資料庫的技術,那麼,到底是什麼因素束縛了關係型資料庫的 效能呢?nosql資料庫到底有哪些優勢?我們從系統設計的角度來了解一下nosql資料庫的四大特點。
索引支援
關係型資料庫創立之初沒有想到今天的網際網路應用對可擴充套件性提出如此高的要求,因此,設計時主要考慮的是簡化使用者的 工作,sql語言的產生促成資料庫介面的標準化,從而形成了oracle這樣的資料庫公司並帶動了上下游產業鏈的發展。關 系型資料庫在單機儲存引擎支援索引,比如mysql的 innodb儲存引擎需要支援索引,而nosql系統的單機儲存引擎是純粹 的,只需要支援基於主鍵的隨機讀取和範圍查詢。nosql系統在系統層面提供對索引的支援,比如有乙個使用者表,主鍵為 user_id,每個使用者有很多屬性,包括使用者名稱,**id(photo_id),**url,在nosql系統中如果需要對photo_id建立索 引,可以維護一張分布式表,表的主鍵為形成的二元組。關係型資料庫由於需要在單機儲存引擎層面支援索引,大大降低 了系統的可擴充套件性,使得單機儲存引擎的設計變得很複雜。
併發事物處理
關係型資料庫有一整套的關於事務併發處理的理論,比如鎖的粒度是表級,頁級還是行級,多版本併發控制機制mvcc, 事務的隔離級別,死鎖檢測,回滾,等等。然而,網際網路應用大多數的特點都是多讀少些,比如讀和寫的比例是10 : 1,並 且很少有複雜事務需求,因此,一般可以採用更為簡單的copy-on-write技術:單執行緒寫,多執行緒讀,寫的時候執行copy-on- write,寫不影響讀服務。nosql系統這樣的假設簡化了系統的設計,減少了很多操作的overhead,提高了效能。
資料結構
關係型資料庫的儲存引擎總是一顆磁碟b+樹,為了提高效能,可能需要有insert buffer聚合寫,query cache快取讀,經常 需要實現類似linux page cache的快取管理機制。資料庫中的讀和寫是互相影響的,寫操作也因為時不時需要將資料flush 到磁碟而效能不高。簡而言之,關係型資料庫儲存引擎的資料結構是通用的動態更新的b+樹。然而,在nosql系統中,比 如bigtable中採用sstable + memtable的資料結構,資料先寫入到記憶體的memtable,達到一定大小或者超過一定時間才會 dump到磁碟生成sstable檔案,sstable是唯讀的。如果說關係型資料庫儲存引擎的資料結構是一顆動態的b+樹,那麼 sstable就是乙個排好序的有序陣列。很明顯,實現乙個有序資料比實現乙個動態b+樹且包含複雜的併發控制機制要簡單 高效地多。
join操作
關係型資料庫需要在儲存引擎層面支援join,而nosql系統一般根據應用來決定join實現的方式。舉個例子,有兩張表: 使用者表和商品表,每個使用者下可能有若干個商品,使用者表的主鍵為,使用者和商品的關聯屬性存放在使用者表中,商品表的主 鍵為item_id,商品屬性包括商品名,商品url,等等。假設應用需要查詢乙個使用者的所有商品並顯示商品的詳細資訊,普 通的做法是先從使用者表查詢指定使用者的所有item_id,然後對每個item_id去商品表查詢詳細資訊,即執行一次資料庫join操 作,這必然帶來了很多的磁碟隨機讀,並且由於join帶來的隨機讀的區域性性不好,快取的效果往往也是有限的。在nosql 系統中,我們往往可以將使用者表和商品表整合到一張寬表中,這樣雖然冗餘儲存了商品的詳細資訊,卻換來了查詢的高 效。
關係型資料庫的效能瓶頸往往不在sql語句解析上,而是在於需要支援完備的sql特性。網際網路公司面臨的問題是應用對 效能和可擴充套件性要求很高,並且dba和開發工程師水平比較高,可以通過犧牲一些介面友好性來換取更好的效能。nosql 系統的一些設計,比如通過寬表實現join操作,網際網路公司的dba和開發工程師也做過,nosql系統只是加強了這種約 束。從長遠來看,可以總結一套約束集合,並且定義乙個sql子集,只需要支援這個sql子集就可以在不犧牲可擴充套件性的 前提下支援比如90%以上的網際網路應用。我想,nosql技術發展到這一步的時候就算是比較成熟了,這也是我們最終想做 的事情。我們在設計和使用nosql系統的時候也可以適當轉化一下思維,如下:
更大的資料量。很多人在使用mysql的過程遇到記錄條數超過一定值,比如2000w的時候,資料庫效能開始下降,這個值 的得出往往需要經過大量的測試。然而,大多數的nosql系統可擴充套件性都比較好,能夠支援更大的資料量,因此也可以採 用一些空間換時間的做法,比如通過寬表的方式實現join。 效能預估更加容易。關係型資料庫由於複雜的併發控制,insert buffer及類似page cache的讀寫優化機制,效能估算相對 較難,很多時候需要憑藉經驗或者經過測試才能得出系統的效能。然後,nosql系統由於儲存引擎實現,併發控制機制等 相對簡單,可以通過硬體的效能指標在系統設計之處大致預估系統的效能,效能預估可操作性相對更強。
NoSQL 從關係型資料庫到非關係型資料庫
關係型資料庫 所謂關係型資料庫,就是指採用了關係模型來組織資料的資料庫。什麼是關係模型,簡單說,關係模型就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個資料組織。關係模型中常用的概念 1 關係 可以理解為一張二維表,每個關係都有乙個關係名,在資料庫中被稱為表名 2 元組 可以...
關係型資料庫與非關係型資料庫(NoSQL)
1.關係型資料庫 mysql oracle sqlserver,acess.特點 sql 結構化的查詢語言 如下圖為關係型資料庫圖示 關係型資料庫存在的問題 1.儲存在硬碟上,讀寫慢 2.保持acid 事務原則,事務四項基本原則 難擴充套件 如何解決?非關係型資料庫 2.非關係型資料庫 優點 一致性...
關係型資料庫和nosql非關係型資料庫
關係型資料庫目前主流 oracle,mysql,sql server,db2等 非關聯式資料庫包括 mongodb,nosql,cloudant 關係型資料庫的優勢 1.複雜查詢可以用sql語句方便的在乙個表以及多個表之間做非常複雜的資料查詢。2.事務支援使得對於安全效能很高的資料訪問要求得以實現。...