傳統的關系型資料庫,如 Oracle、DB2、MySQL、SQL SERVER 等采用行式存儲法(Row-based),在基于行式存儲的資料庫中, 資料是按照行資料為基礎邏輯存儲單元進行存儲的, 一行中的資料在存儲媒體中以連續存儲形式存在。
随着大資料的發展,現在出現的列式存儲和列式資料庫。它與傳統的行式資料庫有很大差別的。
行式資料庫是按照行存儲的,行式資料庫擅長随機讀操作不适合用于大資料。像SQL server,Oracle,mysql等傳統的是屬于行式資料庫範疇。
列式資料庫從一開始就是面向大資料環境下資料倉庫的資料分析而産生。
資料庫以行、列的二維表的形式存儲資料,但是卻以一維字元串的方式存儲,例如以下的一個表:
行式資料庫把一行中的資料值串在一起存儲起來,然後再存儲下一行的資料,以此類推。
1,Smith,Joe,40000;2,Jones,Mary,50000;3,Johnson,Cathy,44000;
列式資料庫把一列中的資料值串在一起存儲起來,然後再存儲下一列的資料,以此類推。
1,2,3;Smith,Jones,Johnson;Joe,Mary,Cathy;40000,50000,44000;
這是一個簡化的說法。
列式存儲
列式存儲(Column-based)是相對于行式存儲來說的,新興的 Hbase、HP Vertica、EMC Greenplum 等分布式資料庫均采用列式存儲。在基于列式存儲的資料庫中, 資料是按照列為基礎邏輯存儲單元進行存儲的,一列中的資料在存儲媒體中以連續存儲形式存在。
列式存儲引擎的适用場景包括:
1、查詢過程中,可針對各列的運算并發執行(SMP),在記憶體中聚合完整記錄集,可降低查詢響應時間;
2、可在資料列中高效查找資料,無需維護索引(任何列都能作為索引),查詢過程中能夠盡量減少無關IO,避免全表掃描;
3、因為各列獨立存儲,且資料類型已知,可以針對該列的資料類型、資料量大小等因素動态選擇壓縮算法,以提高實體存儲使用率;如果某一行的某一列沒有資料,那在列存儲時,就可以不存儲該列的值,這将比行式存儲更節省空間。
當然,跟行資料庫一樣, 列式存儲也有不太适用的場景。主要包括:
1.資料需要頻繁更新的交易場景
2.表中列屬性較少的小量資料庫場景
3.不适合做含有删除和更新的實時操作
随着列式資料庫的發展,傳統的行式資料庫加入了列式存儲的支援,形成具有兩種存儲方式的資料庫系統。例如,随着Oracle 12c推出了in memory元件,使得Oracle資料庫具有了雙模式資料存放方式,進而能夠實作對混合類型應用的支援,當然列式資料庫也有對行式存儲的支援比如HP Vertica。
列式資料庫的代表包括:Sybase IQ,infobright、infiniDB、GBase 8a,ParAccel, Sand/DNA Analytics和 Vertica等
行式存儲
行式存儲(Row-based)的适用場景包括:
1、适合随機的增删改查操作;
2、需要在行中選取所有屬性的查詢操作;
3、需要頻繁插入或更新的操作,其操作與索引和行的大小更為相關。
通常行式資料庫的給出的優化方案是加“索引”,給表分區等等之類的.
适用場景
行式資料庫主要适合于線上交易性的OLTP應用,而列式資料庫主要适合于海量靜态資料的分析,一般應用于OLAP。