关于 OLTP 系统和 OLAP 系统的核心设计思想
数据存储系统的关于查询的典型操作:
-- 第一种需求: 根据 key(1) 找 value(name,age), 单点查询
select name, age from student where id = 1; student:map id=1, value=(name,age)
-- 第二种需求: 根据 department 统计平均年龄, 全表查询
select name, age from student where age > 30; 全表扫描
select department, avg(age) from student group by department; 全表扫描
对于第一种需求来说:
- 如果数据量小,并且数据是结构化的,使用 MySQL 去存储即可
- 如果数据量大,不管是不是结构化的,可以转成 key-value 的存储,使用 HBase,Cassandra 等来解决, OLTP 系统 KV 系统 来满足
对于第二种需求来说:
- 如果数据量小,并且数据是结构化的,使用 MySQL 去存储即可
- 如果数据量大,不管是不是结构化的,设计一个专门用来做分析的存储计算引擎解决分析的低效率问题, 设计一个 OLAP 系统
OLTP存储系统核心设计思想
OLTP 存储系统,核心需求是 实现海量数据集中的低延时随机读写操作
- 01、数据排序:在海量数据中要想保证低延时的随机读写操作,数据最好是排序的
- 02、范围分区:当数据排序之后,可以进行范围分区,来平摊负载,让多台服务器联合起来对外提供服务
- 03、内存 + 磁盘:保证处理效率,也保证数据安全
- 04、内存:必须经过设计,内存具备优秀的数据结构,保证基本的读写高效,甚至为了不同的需求,可以让读写效率倾斜。
- 05、写缓存:将为了实现数据有序而进行的低效率随机写转换为内存随机写+磁盘顺序写的方式
- 06、读缓存:将经常查询的热点数据缓存在内存中,提高查询效率
- 07、磁盘:数据必须存放在磁盘,保证数据安全。磁盘数据文件必须经过精心设计,保证扫描磁盘数据文件的高效率
- 08、跳表:基于数据排序+范围分区构建索引表,形成跳表的拓扑结构,方便用户操作时快速定位数据分区的位置
- 09、LSM-Tree 存储引擎:把随机写变成顺序追加,在通过定期合并的方式来合并数据,去除无效数据,从而实现数据的删除和修改。
- 10、布隆过滤器:快速判断一个元素(1)是否存在于一个庞大集合内/文件中(100E),常数级别的执行效率
海量数据中,如果进行高效率的查询的核心思想:设计一种架构,能够快速把待搜寻的数据范围降低到原来的 1/n,然后再结合索引或者热点数据放在内存等思路,就能实现高效率的查询了。
OLAP存储系统核心设计思想
核心需求是 实现海量数据集中的高性能低延迟查询分析功能
- 01、数据排序
- 02、数据分区分片 + 分布式查询
- 03、列式存储 + 字段类型统一
- 04、列裁剪
- 05、预聚合(搜索引擎: 输入关键词,搜索引擎根据关键词到 数据库 找到这个 关键词对应的所有的 URL:这些 URL 就是提前计算出来的 )
- 06、利用CPU特性:向量化引擎,操作系统必须支持
- 07、主键索引 + 二级索引 + 位图索引 + 布隆索引 等等各种索引技术
- 08、支持近似计算, pv 一个电商平台的 sku 总数
- 09、定制引擎:多样化的存储引擎满足不同场景的特定需要
- 10、多样化算法选择:Volnitsky高效字符串搜索算法 和 HyperLogLog基于概率高效去重算法
单条记录的增删改等操作,通过数据的横向划分,做到数据操作的快速定位,在海量数据查询分析中,一般就是针对大量行少量列做分析,既然并不是全部列,那么把数据做纵向切分把表中的数据按照列来单独存储,那么在做分析的时候,同样可以快速把待查询分析的数据总量降低到原来表的1/n,同样提高效率。而且对于常用的聚合逻辑的结果,也可以提前算出来缓存起来用来提供效率,这就是预聚合技术。
Kylin 是一个把预聚合技术发挥到极致的一个 OLAP 技术,详细见:OLAP引擎——Kylin介绍
它的缺点如下: - 1、预聚合只支持固定的分析场景,无法满足自定义分析场景,所以预聚合只能作为一种可选方案
- 2、维度组合爆炸会导致数据膨胀,这样会造成不必要的计算和存储开销。无必要的维度组合的计算就属于浪费资源
- 3、大概率数据都是增量生成,预聚合不能进行数据更新。所以会产生大量的重算。