SQL 到 NOSQL 的思維轉變

2022-03-25 14:48:53 字數 2200 閱讀 9889

**:

nosql系統一般都會宣傳乙個特性,那就是效能好,然後為什麼呢?關係型資料庫發展了這麼多年,各種優化工作已經做得很深了,nosql系統一般都是吸收關係型資料庫的技術,然後,到底是什麼因素束縛了關係型資料庫的效能呢?我們從系統設計的角度看這個問題。

1, 索引支援。關係型資料庫創立之初沒有想到今天的網際網路應用對可擴充套件性提出如此高的要求,因此,設計時主要考慮的是簡化使用者的工作,sql語言的產生促成資料庫介面的標準化,從而形成了oracle這樣的資料庫公司並帶動了上下游產業鏈的發展。關係型資料庫在單機儲存引擎支援索引,比如mysql的innodb儲存引擎需要支援索引,而nosql系統的單機儲存引擎是純粹的,只需要支援基於主鍵的隨機讀取和範圍查詢。nosql系統在系統層面提供對索引的支援,比如有乙個使用者表,主鍵為user_id,每個使用者有很多屬性,包括使用者名稱,**id(photo_id),**url,在nosql系統中如果需要對photo_id建立索引,可以維護一張分布式表,表的主鍵為形成的二元組。關係型資料庫由於需要在單機儲存引擎層面支援索引,大大降低了系統的可擴充套件性,使得單機儲存引擎的設計變得很複雜。

2, 事務併發處理。關係型資料庫有一整套的關於事務併發處理的理論,比如鎖的粒度是表級,頁級還是行級,多版本併發控制機制mvcc,事務的隔離級別,死鎖檢測,回滾,等等。然而,網際網路應用大多數的特點都是多讀少些,比如讀和寫的比例是10 : 1,並且很少有複雜事務需求,因此,一般可以採用更為簡單的copy-on-write技術:單執行緒寫,多執行緒讀,寫的時候執行copy-on-write,寫不影響讀服務。nosql系統這樣的假設簡化了系統的設計,減少了很多操作的overhead,提高了效能。

3, 動態還是靜態的資料結構。關係型資料庫的儲存引擎總是一顆磁碟b+樹,為了提高效能,可能需要有insert buffer聚合寫,query cache快取讀,經常需要實現類似linux page cache的快取管理機制。資料庫中的讀和寫是互相影響的,寫操作也因為時不時需要將資料flush到磁碟而效能不高。簡而言之,關係型資料庫儲存引擎的資料結構是通用的動態更新的b+樹,然而,在nosql系統中,比如bigtable中採用sstable + memtable的資料結構,資料先寫入到記憶體的memtable,達到一定大小或者超過一定時間才會dump到磁碟生成sstable檔案,sstable是唯讀的。如果說關係型資料庫儲存引擎的資料結構是一顆動態的b+樹,那麼sstable就是乙個排好序的有序陣列。很明顯,實現乙個有序資料比實現乙個動態b+樹且包含複雜的併發控制機制要簡單高效地多。

4, 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系統的時候也可以適當轉化一下思維,如下:

1, 更大的資料量。很多人在使用mysql的過程遇到記錄條數超過一定值,比如2000w的時候,資料庫效能開始下降,這個值的得出往往需要經過大量的測試。然而,大多數的nosql系統可擴充套件性都比較好,能夠支援更大的資料量,因此也可以採用一些空間換時間的做法,比如通過寬表的方式實現join。

2, 效能預估更加容易。關係型資料庫由於複雜的併發控制,insert buffer及類似page cache的讀寫優化機制,效能估算相對較難,很多時候需要憑藉經驗或者經過測試才能得出系統的效能。然後,nosql系統由於儲存引擎實現,併發控制機制等相對簡單,可以通過硬體的效能指標在系統設計之處大致預估系統的效能,效能預估可操作性相對更強。

SQL到NOSQL的思維轉變

nosql系統一般都會宣傳乙個特性,那就是效能好,然後為什麼呢?關係型資料庫發展了這麼多年,各種優化工作已經做得很深了,nosql系統一般都是吸收關係型資料庫的技術,然後,到底是什麼因素束縛了關係型資料庫的效能呢?我們從系統設計的角度看這個問題。1,索引支援。關係型資料庫創立之初沒有想到今天的網際網...

SQL到NOSQL的思維轉變

nosql系統一般都會宣傳乙個特性,那就是效能好,然後為什麼呢?關係型資料庫發展了這麼多年,各種優化工作已經做得很深了,nosql系統一般都是吸收關係型資料庫的技術,那麼,到底是什麼因素束縛了關係型資料庫的效能呢?我們從系統設計的角度看這個問題。1.索引支援 關係型資料庫創立之初沒有想到今天的網際網...

SQL到NOSQL的思維轉變

nosql系統一般都會宣傳乙個特性,那就是效能好,然後為什麼呢?關係型資料庫發展了這麼多年,各種優化工作已經做得很深了,nosql系統一般都是吸收關係型資料庫的技術,然後,到底是什麼因素束縛了關係型資料庫的效能呢?我們從系統設計的角度看這個問題。1,索引支援。關係型資料庫創立之初沒有想到今天的網際網...