天天看點

【資料蔣堂】第42期:RDB與NoSQL的通路性能

【資料蔣堂】第42期:RDB與NoSQL的通路性能

我們繼續從軟體角度上看外存資料源的性能,來考察資料庫的性能特點,在這篇文章中,我們隻關心資料的通路性能,而不涉及計算性能。

關系資料庫也是很常見的資料存儲方式。本質上講,資料庫其實也是一種特殊的二進制檔案,但它的性能會弱于直接寫在作業系統下的檔案,主要原因在于資料庫通常都要提供資料更新的能力,這就會産生影響性能的因素:

1. 緊湊性與壓縮手段

資料庫要考慮資料的更新,一般會采用段頁式的分塊存儲,在存儲資料時不會把分塊完全填滿,而會留一小部分空白區用于後續的修改動作。這樣,占用的硬碟空間就會比不考慮更新動作的檔案更大一點。

因為要更新資料,也很難實作資料壓縮。比如上一篇所說的把小整數存成較短位元組的方案,如果采用了這種方案,一旦這個小整數被改成了大整數,原來的空間就存不下了,就要把後續資料都向後移動,這會使資料更新成本過高,是以一般資料庫都不采用壓縮手段,而直接根據資料類型配置設定空間,也會造成空間的浪費,極端情況會出現占用空間大于文本的現象。

2. 事實一緻性帶來的複雜性

許多商業資料庫還會同時支援OLTP業務,在讀取資料時要提供一緻性的能力,這會使通路資料的動作複雜度變大很多。同一條資料,由于其它事務的寫操作,可能出現多個備份,在讀取時資料庫要根據事務的啟動時刻找到正确的那一個,這是個非常麻煩的動作,對性能影響很大。

【資料蔣堂】第42期:RDB與NoSQL的通路性能

另外,前面文章還提到過,按塊存儲的結構對于分段也不夠自由,不象檔案那樣可以實施更靈活的并行手段,也會導緻資料庫的性能表現弱于直接 檔案。

資料庫普遍還有一個IO性能不佳的問題,資料在資料庫中運算時性能尚可,但要通過資料庫接口取出來就非常慢,實測的情況表明,這個性能經常可能會比用文本存儲還慢。對于這個問題,在資料庫本身負擔不重時,可以采用并行取數的方法來解決,具體細節及代碼我們将在以後再詳述。

NoSQL常常被用作大資料處理,但是,它真地能獲得高性能嗎?

這要分情況,看進行什麼樣的處理。

NoSQL産品一般都不提供事務一緻性的能力,這是在資料通路時的動作要比關系資料庫簡單了許多,不需要考慮復原段、多備份等問題。而且,放棄事務的NoSQL一般也更容易橫向擴充,使用更多機器來承載更大的業務量。在這方面,NoSQL确實會有更高的性能,特别是高并發寫入時的優勢要比關系資料庫大得多。

不過,對于單純的分析型業務,卻不完全是這樣。

許多分析型關系資料庫也不考慮事務一緻性的問題,通路動作同樣也較為簡單。NoSQL不處理事務一緻性帶來的性能優勢,與這些分析型資料庫比并沒有特别的地方。

【資料蔣堂】第42期:RDB與NoSQL的通路性能

NoSQL産品常常使用Key-Value型存儲組織,Value的随意性會帶來結構多樣性的好處,即使用NoSQL存儲資料時不需要事先确定資料結構,不象關系資料庫那樣必須先建個有特定資料結構的表才能使用,這是NoSQL非常友善的地方。

但是,多樣性和高性能是一對天生的沖突!

多樣性意味着每條記錄的資料結構都可能不一樣。在存儲資料時同時也要存儲結構,增大了存儲量,在解析資料時也要去比對資料結構中的字段,增加大了複雜度。而關系資料庫中同一表的資料結構是确定且相同的,結構隻要存儲一份,解析資料時的字段對應也非常簡單,當資料量很大時,這個優勢就會非常明顯。

大多數Key-Value式的NoSQL産品,隻是在用Key尋找Values時性能很好(這隻要有個Hash索引就能夠用Key找到對應的記錄,關系資料庫建了索引也可以),但面臨需要對資料周遊才能完成的計算時(比如過濾條件不是針對Key的),它的性能就會遠遠低于确定資料結構的關系資料庫。把NoSQL用于高性能大資料分析業務是個錯誤的選擇,但現實中卻經常有人在這麼用。

原文釋出時間為:2018-02-12

本文作者:蔣步星