倒排與列存
- 一直傻傻分不清倒排和列存,今天有空梳理一下,主要有四個概念要明確:
- 索引方式: 正向索引,反向索引(倒排)
- 存儲方式: 行存,列存
- 數據結構: HashMap,B-Tree,BitMap...
- 存儲結構:
- 順序組織(順序文件)
- 索引組織(索引文件)
- 散列組織(散列文件)
- 鏈組織(多關鍵字文件)
索引方式
- 索引方式是種指導性的的思想,和具體數據結構和存儲結構沒有直接關係
- 正向索引:DocId->Value
- 反向索引:Value->DocId
倒排索引 Inverted Index
- 倒排索引就是反向索引,是信息檢索中最基礎的索引方法,具體是把索引存爲倒排表和倒排鏈,倒排表存的是全部的值,倒排鏈存的是 DocId 列表。
存儲方式
- 存儲方式就是正排中存value的方式,也是種指導思想,和具體數據結構,存儲結構沒有關係的
- 存儲方式主要分爲按行存儲和按列存儲(column-oriented)兩種
按行存儲
- 以單行做爲一個最小存儲單元,用偏移量表示各列
- 沒有索引的查詢使用大量I/O
- Mysql 就是種按行存儲的方式,對於無條件的單列取出,須要遍歷全表
按列存儲
- 以一列做爲一個record,採起對齊的方式或者 MetaData 的方式記錄行信息
- 數據便是索引,只查單列的狀況下能夠大量下降系統IO
- 同種數據在一塊兒,方便壓縮
- HBase 就是按列存儲的,採用 MetaData 記錄行信息
數據結構
- 數據結構是數據真實的組織形態,是邏輯層面的真實結構
- 同一種數據結構能夠實現不一樣的思想,下面以 B-Tree 舉例
B-Tree
倒排
- B 樹若是每一個內部節點存的是具體的value,葉子節點存 id,那麼這就是個倒排
- 真實場景中,的確有很多搜索引擎是這麼存倒排的
正排
- 若是內部節點存 Id,葉子節點存內容,這就是個正排
- 真實場景中,mysql 的 pk 索引就是這麼存的
- 行存列存
- 若是正排的 B-tree 的葉子節點存的是一行的值,那麼這就是行存,反之,若是是一列的值,就是列存
存儲結構
- 存儲結構就是數據真實落盤的方式,是物理層面的真實結構
- 根據不一樣的數據結構有不一樣的存儲結構
- 通常而言,B-Tree 就是索引文件落盤,而 HashTable 則能夠以散列存儲。
- 目前基本都是索引結構落盤,不一樣產品的具體實現均不相同。
- 如 IBM 的VSAM就是存儲 B-tree 的一種文件格式,由三部分組成:索引集,順序集和數據集
列存與倒排
- 回到開頭的問題,列存和倒排究竟是什麼關係呢?
- 列存是一種正排的存儲思想,和倒排沒什麼關係
- 通常因爲搜索引擎的排序都是少數列的,因此通常搜索引擎都是精確查詢用倒排,比較算分用列存
參考資料
- 幾張圖看懂列式存儲
- 數據結構-文件
- 傳統的(Oracle)行存儲和(HBase)列存儲的區別
- 二級索引和倒排的區別
- 列式存儲 HBase 系統架構學習
歡迎關注本站公眾號,獲取更多信息