目錄
- 一、關系數據庫的缺點
- 二、常見的 NoSQL 方案分 類
- 2.1、K-V 存儲
- 2.2、文檔數據庫
- 2.3、列式數據庫
- 2.4、全文搜索引擎
- 三、高性能 NoSQL 方案的典型特征和應用場景
- 3.1、K-V 存儲典型特征和應用場景
- 3.2、文檔數據庫典型特征和應用場景
- 3.1.1、文檔數據庫的 no-schema 特性的優勢
- 3.1.2、文檔數據庫的 no-schema 特性的劣勢
- 3.3、列式數據庫典型特征和應用場景
- 3.4、全文搜索引擎典型特征和應用場景
- 3.4.1、全文搜索基本原理
- 3.4.2、全文搜索的使用方式
本文來源:極客時間vip課程筆記
一、關系數據庫的缺點
-
關系數據庫存儲的是行記錄,無法存儲數據結構
以微博的關注關系為例,“我關注的人”是一個用戶 ID 列表,使用關系數據庫存儲只能將列表拆成多行,然后再查詢出來組裝,無法直接存儲一個列表。
-
關系數據庫的 schema 擴展很不方便
關系數據庫的表結構 schema 是強約束,操作不存在的列會報錯,業務變化時擴充列也比較麻煩,需要執行 DDL(data definition language,如 CREATE、ALTER、DROP 等)語句修改,而且修改時可能會長時間鎖表(例如,MySQL 可能將表鎖住 1 個小時)。
-
關系數據庫在大數據場景下 I/O 較高
如果對一些大量數據的表進行統計之類的運算,關系數據庫的 I/O 會很高,因為即使只針對其中某一列進行運算,關系數據庫也會將整行數據從存儲設備讀入內存。
-
關系數據庫的全文搜索功能比較弱
關系數據庫的全文搜索只能使用 like 進行整表掃描匹配,性能非常低,在互聯網這種搜索復雜的場景下無法滿足業務要求。
二、常見的 NoSQL 方案分 類
2.1、K-V 存儲
- 解決關系數據庫無法存儲數據結構的問題,以 Redis 為代表。
2.2、文檔數據庫
- 解決關系數據庫強 schema 約束的問題,以 MongoDB 為代表。
2.3、列式數據庫
- 解決關系數據庫大數據場景下的 I/O 問題,以 HBase 為代表。
2.4、全文搜索引擎
- 解決關系數據庫的全文搜索性能問題,以 Elasticsearch 為代表。
三、高性能 NoSQL 方案的典型特征和應用場景
3.1、K-V 存儲典型特征和應用場景
-
K-V 存儲的全稱是 Key-Value 存儲,其中 Key 是數據的標識,和關系數據庫中的主鍵含義一樣,Value 就是具體的數據。
-
Redis 是 K-V 存儲的典型代表,它是一款開源(基于 BSD 許可)的高性能 K-V 緩存和存儲系統。Redis 的 Value 是具體的數據結構,包括 string、hash、list、set、sorted set、bitmap 和 hyperloglog,所以常常被稱為數據結構服務器。
-
以 List 數據結構為例,Redis 提供了下面這些典型的操作(更多請參考鏈接:http://redis.cn/commands.html#list):
LPOP key 從隊列的左邊出隊一個元素。
LINDEX key index 獲取一個元素,通過其索引列表。
LLEN key 獲得隊列(List)的長度。
LLEN key 獲得隊列(List)的長度。
-
以上這些功能,如果用關系數據庫來實現,就會變得很復雜。例如,LPOP 操作是移除并返回 key 對應的 list 的第一個元素。如果用關系數據庫來存儲,為了達到同樣目的,需要進行下面的操作:
每條數據除了數據編號(例如,行 ID)