vcloud.163.com
网易视频云:Infobright初探
网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,为客户提供稳定流畅、低时延、高并发的视频直播、录制、存储、转码及点播等音视频的PaaS服务。在线教育、远程医疗、娱乐秀场、在线金融等各行业及企业用户只需经过简单的开发即可打造在线音视频平台。现在,网易视频云与大家分享一下Infobright。
Infobright是一个有多年历史的开源的adhoc数据仓库软件。它首次发布于2005年,并于2008年开源社区版本。并在2009年成为MySQL合作伙伴,并集成到MySQL中。
Infobright虽然集成到MySQL中,默认有一个BrightHouse引擎,但是与InnoDB/MyISAM这类引擎不同在于,Infobright有自己的查询优化层,它仅仅是利用的MySQL原有的一些查询解析以及重写机制。
Infobright最大的特点是列式存储,数据压缩以及基于它独有的知识网格(Knowledge grid)查询优化方式。暂时撇开列存以及压缩不表,本文着重分析知识网格的实现方式,以及它的查询优化器如何进行SQL优化。
传统的数据库利用创建索引进行查询优化,无论是MyISAM这样堆表索引或者是InnoDB主键的聚蔟索引,都是建立表中的若干列到整条表纪录的映射关系,目的就是为了已较小的访问代价尽快的定位符合查询条件的数据行,为控制访问代价,最流行的数据库索引是由B树,以及B树的变种来实现。
vcloud.163.com
B树一般使用二分查找的方式从根节点到叶子节点定位纪录。当索引能完全存储在内存中时,索引查询的速度会非常的快。然而当索引需要内外存换入换出时,性能会有明显的下降。不仅是性能,B树索引本身占用的空间也相对较大,常见的索引键构成为索引列加行号或者是索引列加主键,一条索引键对应一条记录,当数据库使用不当,或者是为查询建立过多索引或者索引中含有过多的列时,索引本身的体积会很快成为一个现实的问题。此外,B树索引也不适合unique键值较少的列(效率低),同时也不支持前导模糊查询。所以B树索引最适合的是小数据量的OLTP场景。
Infobright为OLAP设计,它没有索引的概念,而是利用知识网格进行数据的筛选,从而达到降低数据访问代价的目的。在说明知识网格之前首先需要说明一些基础的概念:
1.DataPack(DP):BrightHouse引擎将数据按照64k行的大小切分成一个个Rough rows,Rough rows根据列由分为一个个DP, DP是BrightHouse底层的数据存储单元,也是基本压缩解压单元。
2.DataPackNode(DPN):一个DPN与一个DP对应,存储了一些基本信息,最大值,最小值,平均值、记录值总和, null值的数量以及记录的总数量。3.Knowlege Node (KN):相比DPN更高层次的一些智能化的信息,包括有直方图、字符位图、pack-to-pack。
vcloud.163.com
在存储引擎层,DPN和KN组成了知识网格,DP是底层的存储。DP包含65536条数据,而且根据DP内数据分布的不同会采用不同的压缩方式,部分压缩算法的解压代价是较高的,知识网格的作用类似于索引能有效地过滤查询中不符合条件的数据,从而加快查询响应速度。
知识网格采用了一种模糊处理的概念,因此以相对较小的代价来定位以DP为最小单位的数据,根据Infobright的白皮书上的说明,知识网格只占据数据总大小的1%以下,因此在绝大多数情况下可以轻松装入内存。而且知识网格是一个“智能”的查询过滤器,能根据线上查询的负载优化自身的内容。接下来我们来看一下知识网格的实现。
KN有三种基本的类型:
vcloud.163.com
现实中,数据对于上述的三种KN的影响较大,比如HIST中数据的稠密性,并且列内的DP之间的依赖关系没有涉及,根据机器学习或者数据挖掘的理论,尚可引入更多的信息来帮助加速查询。
DPN、HIST以及CMAP在数据导入的时候伴随着生成,而Pack-to-Pack则是在查询的过程中生成,知识网格数是持久化到外存的,DPN存储于表目录.bht文件中,与数据文件隔离,随着数据加载同时load到内存中。而KN由配置文件指定位置,HIST.xxx.yyy.rsi为直方图文件,CMAP.xxx.yyy.rsi为CMAPs文