nosql 是一個用于描述高擴充高性能的非關系資料庫的術語。 nosql 資料庫提供的 schemafree 資料模型能夠讓應用無需預先定義表結構,适應業務的多元化發展,而對超大資料規模和高并發的支援讓 nosql 資料庫得到了廣泛的應用。
<a href="#">通路資料庫</a>
<a href="#">建立表</a>
<a href="#">寫入資料</a>
<a href="#">檢索資料</a>
<a href="#">更新資料</a>
<a href="#">删除資料</a>
<a href="#">删除表</a>
關系型資料庫
nosql 資料庫
資料模型
關系模型對資料進行了規範化,嚴格的定義了表、列、索引、表之間的關系及其他資料庫元素,使一張資料表的所有資料具有相同的結構。
非關系(nosql)資料庫一般不會對表的結構進行嚴格的定義,一般使用分區鍵及鍵值來檢索值、列集或者半結構化資料。
acid
傳統關系型資料庫支援由 acid (原子性、一緻性、隔離性和持久性)定義的一組屬性。其原子性展現在一個事務"全部成功或者全部失敗",即完全執行成功或完全不執行某項事務。一緻性表示資料庫事務不能破壞關系資料的完整性以及業務邏輯上的一緻性。隔離性要求并發事務應分别執行,互不幹擾。持久性即一旦事務送出後,它所做的修改将會永久的儲存在資料庫上,即使出現當機也不會丢失。
為了獲得更為靈活的可水準擴充的資料模型, nosql 資料庫通常會放棄傳統關系資料庫的部分 acid 屬性。憑借這些特性,nosql資料庫可用來克服一系列包括性能瓶頸、可擴充性、營運複雜性以及不斷增加的管理和支援成本的問題,這也讓 nosql 資料庫成了傳統關系型資料庫在面臨海量資料及高并發挑戰時的最佳選擇。
性能
性能一般取決于磁盤子系統、資料集大小以及查詢優化、索引和表結構。
寫性能通常受限于磁盤子系統,讀性能則受限于結果集的大小
擴充
進行縱向擴充最簡單的方式是使用更快的cpu、磁盤等硬體裝置。要獲得跨分布式系統的關系表,就需要增加使用成本及技術複雜度。
能夠利用低成本硬體的分布式叢集進行橫向擴充,進而在不增加延遲的前提下提高吞吐量和資料規模。
api
對存儲和檢索資料的請求由符合結構化查詢語言 (sql) 的查詢來傳達。這些查詢由關系資料庫系統來解析和執行。
應用開發人員可以使用nosql資料庫開放的 api 輕松存儲和檢索資料。通過分區鍵及鍵值,應用可以查找鍵值對、列集或者半結構化資料。
表格存儲(tablestore)是 nosql 資料庫的一種,提供海量 nosql 資料存儲錯誤,支援 schemafree 的資料模型,提供單行級别的事務,服務端自動對資料進行分區和負載均衡,讓單表資料從 gb 到 tb 再到 pb__,通路并發從__0__至__百萬__都無需繁瑣的擴容流程,寫性能在 __tb 及 pb 級資料規模都能保持在單個毫秒,讀性能隻依賴結果資料集,而不受資料量的影響。
是以相比 oltp(聯機事務處理)場景,表格存儲更适用于 web 規模級應用程式,包括社交網絡、遊戲、媒體共享和 iot(物聯網)、日志監控等場景。
與傳統關系型資料庫不同,用戶端都是通過http協定來通路表格存儲。
下圖展示了用戶端與傳統關系型資料庫和表格存儲之間的互動。
表格存儲通過用戶端來通路資料,用戶端初始化方式如下:
用戶端初始化需要填入如下參數:
endpoint:通路的表格存儲執行個體的url位址
accesskeyid:通路表格存儲所使用的accesskeyid
accesskeysecret:通路表格存儲的所使用的accesskeysecret
instancename:通路的表格存儲的執行個體名稱
表是關系資料庫和表格存儲中的基本資料結構。關系資料庫建立表時就需要定義完整的資料結構。相比之下,表格存儲的資料表則隻需要定義主鍵資訊。
使用 create table 語句建立表,如以下示例所示。
此表的主鍵包含 user_id 和 time_stamp,在建立資料表是必須嚴格的定義所有的主鍵和屬性列,如有需要,需要使用 alter table 語句更改這些定義。
使用表格存儲建立資料表并指定如下參數,如下所示:
此表的主鍵包含 user_id 和 time_stamp,需要提供的參數主要有:
table_name:表名稱
primarykeyschema:主鍵的名稱及類型
timetolive:資料表的資料過期時間
maxversion:資料表屬性列的最大版本數
關系資料庫中,表是一個由行和列組成的二維資料結構,可以使用 <code>insert</code> 語句向表中添加行:
使用表格存儲中可以使用 <code>putrow</code> 接口插入一行資料:
使用 putrow 接口需要了解一下幾個關鍵事項:
除了表名 <code>table_name</code> 和主鍵 <code>primarykey</code>,屬性列和類型可以在寫入時定義
多行資料的同名屬性列也可以使用不同的類型
大多數 sql 資料庫是面向事務的,當發出 <code>insert</code> 語句時,隻有 <code>commit</code> 之後對資料的修改才是永久性的。使用表格存儲,當表格存儲通過 http 200 狀态碼(ok)進行回複時, putrow 寫入的資料已經被持久化到所有備份。
sql select 語句可以查詢關鍵列、非關鍵列或任意組合。where 子句确定傳回的行,如以下示例所示:
需要了解的幾個關鍵事項:
該查詢等同于
當然,也可以通過如下的方式來實作:
該實作對整張表進行了掃描,并找出 <code>user_id='10100' and behavior_type='collect'</code> 的記錄,但是由于是全表掃描,其效率會遠遠低于基于特定主鍵範圍的查詢。
過濾器 filter 可以支援最多10個條件組合,可以用于 getrow、batchgetrow 和 getrange 接口中。
過濾器 filter 是對getrange的資料在服務端進行過濾,并不會減少磁盤的io次數,但是能夠有效的降低網絡傳輸流量。
良好的主鍵設計能夠大大送出範圍查詢的效率。
關系資料庫中,可以使用 update 語句對表中的一行或者多行記錄進行修改:
使用updaterow接口需要了解一下幾個關鍵事項:
關系資料庫中,可以使用 drop table語句來删除不再需要的資料表:
需要注意:表一經删除将無法恢複。