主流列式数据库评测:InfiniDB
)。本文测试的InfiniDB版本是2010年12月20日发布的2.02版,下载文件名分别为InfiniDB64-2.0.2-2.exe 和InfiniDB64-ent-2.0.2-2.exe。安装文件大约在30兆字节。32位最新版只提供了InfiniDB社区版,企业版只有64位,包括Windows和Linux平台。
64位InfiniDB在Windows 2008 x64上安装总是失败,但文档说是支持的,经技术人员确认,该安装文件只支持在windows 2008 R2 上安装。网站也提供了一些使用手册文档下载和论坛(社区)的支持,这为用户试用带来了方便。相比Infobright,InfiniDB的文档和论坛的技术支持水平都差不多,都是能比较快地解答用户使用的问题。
安装界面全是图形交互式的,很简单,一路Next就安装完成了。但最后一步要耗费一定的时间初始化系统表。
安装完成以后,在开始/所有程序下新增了一个InfiniDB的菜单项,有服务器启动、关闭的快捷方式,数据库后台服务默认是自动开启的。与Infobright类似,它的安装不包括图形化管理工具,只提供了命令行界面的客户端和其他工具,但有所差别的是,InfiniDB对MySQL作了更大范围的改动,主要体现在下面几方面。
1.执行的后台进程更多。
2.文件存储方式更类似DB2和PostgreSQL,采取多目录、多数据文件的方式,目录和文件命名对用户不可辨别,而且在数据库和表删除以后,数据文件并不收缩,而是供新增的其他表和数据利用。
按惯例,先看一下数据库安装在磁盘上的文件和目录。
D:\Infobright 的目录
我们看到,比原始的mysql安装目录多了几个子目录,如bulk,data1,etc等。
bulk目录用于批量加载数据。
Data1目录用于存放infiniDB存储引擎的数据文件。
mysqldb目录用于存放mysql存储引擎的数据文件,相当于原来的data。
etc目录用于存放系统表初始化脚本和错误提示信息。
Bin目录用于存放可执行文件和动态链接库。
如上图所示,安装程序在磁盘上创建了几个目录和一些文件。bin目录下面除了MySQL原始的可执行文件,还包括InfiniDB特有的系统文件和工具,其中3个批处理文件,分别用于InfiniDB后台服务的启动和关闭,客户端的启动。
之所以需要初始化脚本,是由于InfiniDB是以插件的方式启动的,需要把这些信息写入系统表。首次启动时,安装程序会调用这些脚本。
在Windows任务管理器中可以观察到InfiniDB启动了8个后台进程。
我们也可以用控制台方式启动InfiniDB,这种方式可以更详细地观察服务器的启动过程,如果启动出错,可以根据出错信息的提示排除错误。
我们观察到InfiniDB采用的MySQL版本是5.1.39.
再来观察数据文件物理存储,在创建了一些表以后,data1目录下创建了子目录000.dir,下面还有很多类似的子目录。最外层子目录下有FILE000.cdf、FILE001.cdf等,可以看出,数据文件命名对用户是无法辨认的,这为数据备份带来了难度。而前文提到的infobright只要在数据库进程关闭时将某个数据库的目录备份即可。
图3
InfiniDB企业版和社区版的具体区别。参见http://www.calpont.com/resources/community,可见社区版仍然支持DML操作,这点比infobright强,但付出的代价是不支持压缩,但即使是企业版压缩比infobright也差很多。我们对tpch scala=10的10GB数据导入以后,占用空间达8775933952字节,只压缩了13%,而同样的数据,infobright占用1951699241字节,压缩了81%。
二、数据库的功能
数据库的基本功能有CRUD(表的创建、插入、更新、删除)等方面,下面我们逐个测试。
下面创建一个test数据库,然后在其中创建一个表t1,可以观察到默认的存储引擎仍然是MyISAM。
这是一个需要注意的地方,如果要使用InfiniDB引擎,或者在创建表时显式说明,或者设置默认存储引擎为InfiniDB,建议用前一种。因为后一种使某些查询语句失效,影响查询执行。最简单的语法都报错。
对于比较规律的测试数据,可以通过存储过程产生,语法规则和mysql的一致, InfiniDB引擎的DML速度比较慢,无论设置自动提交开关为关闭或开启,插入性能都很糟糕,但更新和删除的效率还可以,并且不支持truncate 表操作。
InfiniDBInI的事务处理实现与Oracle的类似,但默认是自动提交的,可设置不自动提交事务,默认是在会话级的。设置不自动提交事务以后,本会话可以脏读,其他会话则只能查询到最后一次提交时的内容。如果多个会话对同一个表执行dml操作,后发出的命令被挂起,等候前一个会话提交或回滚才能执行。大部分和Oracle的表现一致,就不一一举例了。
InfiniDB支持中文,不过需要做一些设置。
InfiniDB和原始MySQL的SQL解释、执行引擎不同,因此,不支持包含InfiniDB的表和其他数据引擎的表的关联操作,但其他原始MySQL的数据引擎支持从InfiniDB表查询数据并保存结果。
下一步是批量插入数据,企业版数据加载仍支持mysql的load data infile命令。但对InfiniDB存储引擎,在大数据量的时候,这种方式的效率太低,不适用。InfiniDB专门开发了二个工具配合,可以达到高速加载的效果,参见下一节测试的结果。
InfiniDB专门为InfiniDB存储引擎的表添加了系统数据库calpontsys和2个系统表systable、syscolumn记录一些系统信息,可供用户参考。
三、数据加载和查询性能
为了提供用户在做数据库选型的参考,下面沿用TPC-H 2.8 scale为1的大约1G字节数据来进行较大数据量的测试,先进行数据加载测试,MySQL原始加载工具在InfiniDB表的性能表现是不可接受的。区区100000行耗时24秒,和Infobright不在一个水平。
下面我们来看专用工具cpimport。
这里有一个陷阱,Infinidb的默认存储引擎是myisam,该存储引擎不被cpimport支持,所以在调用cpimport时报如下错误:
修改ddl语句,重新设置存储引擎,又出现新的问题,原来infinidb不支持约束,包括主键约束和非空约束。
取消约束后再次生成表,这下工具可以成功执行了。
前面花了较大篇幅描述InfiniDB,下面简略介绍一下MonetDB, MonetDB是一个内存数据库原型系统,目前仍然是一个学术机构的开源项目,差不多每6个月出一个Release,目前版本号为v5.22.1,但文档比较陈旧,只有2008年的,并不推荐在生产环境中使用。除了SQL版本,还有XQuery版本,我使用的是2010年10月发布的SQL版,下载地址为http://dev.monetdb.org/downloads/Windows/Oct2010-SP1/MonetDB5-SQL-Installer-x86_64-20101215.msi,安装包大约8.9M,是目前所测试的几种数据库管理系统中最小的,因为它是个独立的软件,不用包含对MySQL的支持。安装后同样生成启动服务器和客户端的快捷方式。双击即可运行。在客户端执行ddl脚本和导入数据都非常顺利。
下面是查询测试结果。InfiniDB对多种SQL语句的语法支持不太好,原始tpch查询脚 本有6个无法运行,经联系InfiniDB技术人员,使用了他们提供的修改后版本运行成功。
表1 TPC-H 2.8 scale=1的测试对比,单位:秒
*表示原始SQL语法不被支持,修改SQL为等价的方式后的结果。
单纯从上面的结果看,似乎MonetDB比InfiniDB绝大多数时候都具有更好的性能,但是对于更大的数据量以后,二者的表现还有待进一步研究。
MonetDB只是一个单机版的软件,并不支持网络访问,这限制了它的应用。
四、结束语
测试进行到这里,相信读者对InfiniDB已经有了初步的印象,查询性能某些方面已经超越了传统的行存储数据库(22个查询中的7个)。但它对SQL写法也是最挑剔的,需要开发人员非常熟悉InfiniDB的语法。MonetDB在scala为1的时候表现优异,除了第21个查询异常慢外,22个查询中的18个都超越了Oracle。而且它对SQL语法的支持上佳,不加修改全部通过,支持with语句查询,支持索引,另外还支持主键和外键约束,这在列存储数据库中是难能可贵的。
本系列文章选择了一种国产列存储数据库和三种国外列存储数据库。我们看到,列存储数据库在它声称所擅长的数据仓库应用中还不能取代传统行存储数据库。只有两者结合,各发挥所长才能提供给用户较好的效果。原因有下面几点:
1.由于先天的列存储限制,缺乏对索引的支持(MonetDB除外),降低了进一步优化的可能。而行存储数据库如果加上合适的索引,上述耗时较长的查询还可以大大降低。
2.支持的查询语法限制。所有的4种数据库都不支持分析函数,查询类型大打折扣。
3.不支持DML操作或者虽然支持,但效率很低。不能存储查询的结果就很难用了。
4.多数数据库不支持大量用户连接,不能满足多用户分析需要。
5.大多数不包含图形界面管理工具,用户需要另外购置第三方工具。
6.如果已有系统是基于传统数据库,如果要往列存储数据库迁移,SQL语法不兼容和不同写法的效率大相径庭使迁移难度很大。
另一种商业列存储数据库Sybase IQ也在其文档中明确说明,其需要和传统的Sybase ASE配合使用,方能发挥出更大的作用。这也从另一侧面反映了列存储数据库在当今的处境,还没有达到大规模真正成熟应用的程度。
主流列式数据库评测:InfiniDB的更多相关文章
- 列式数据库~clickhouse 底层存储原理
简介:今天介绍列式数据库的一些基本原理 一 数据目录 Data目录 数据存储目录,数据按照part分成多个文件夹,每个文件夹下存储相应数据和对应的元信息文件 Metadata 表定义语句,存储所有表 ...
- 列式数据库~clickhouse 场景以及安装
一 简介:列式数据库clickhouse的安装与基本操作二 基本介绍:ClickHouse来自俄罗斯,是一款列式数据库三 适用场景: 简单类型的大数据统计四 限制 1 不支持更新操作,不支持事 ...
- Hbase与Oracle比较(列式数据库与行式数据库)
Hbase与Oracle比较(列式数据库与行式数据库) 1 主要区别 Hbase适合大量插入同时又有读的情况 Hbase的瓶颈是硬盘传输速度,Oracle的瓶颈是硬盘寻道时间. Hbase本质上只 ...
- Hadoop HBase概念学习系列之HBase里的列式数据库(十七)
列式数据库,从数据存储方式上有别于行式数据库,所有数据按列存取. 行式数据库在做一些列分析时,必须将所有列的信息全部读取出来 而列式数据库由于其是按列存取,因此只需在特定列做I/O即可完成查询与分析, ...
- 数仓选型必列入考虑的OLAP列式数据库ClickHouse(上)
概述 定义 ClickHouse官网地址 https://clickhouse.com/ 最新版本22.4.5.9 ClickHouse官网文档地址 https://clickhouse.com/do ...
- 数仓选型必列入考虑的OLAP列式数据库ClickHouse(中)
实战 案例使用 背景 ELK作为老一代日志分析技术栈非常成熟,可以说是最为流行的大数据日志和搜索解决方案:主要设计组件及架构如下: 而新一代日志监控选型如ClickHouse.StarRocks特别是 ...
- Spanner:谷歌新一代全球部署的列式数据库
Spanner 是一个可扩展的.全球分布式的数据库,提供分布式ACID. 架构 universe:一个部署的实例成为universe,目前谷歌有3个,分别为开发/测试/线上 Zone:一个数据中心,相 ...
- 列式数据库~clickhouse 副本集架构的搭建
clickhouse 搭建副本集 一 原理: 1 依赖ZK,ZK的基础上,ZK存储数据库元数据 2 使用复制表引擎创建复制表,包括ZK路径和副本名,相同ZK路径的表可以相互复制 3 复制表本身拥 ...
- 列式数据库~clickhouse日常管理
clickhouse日常管理一 变量相关 1 查看变量 system.setting相关表 2 设置变量 set variables= 请注意这里是session级别,如果想永久生 ...
随机推荐
- 负载均衡LVS(DR模式)安装实战
1.编译安装ipvsadm 首先从LVS官网下载tarball,解压后make && make install即可. 要注意的是LVS的依赖有:popt-static.libnl.ke ...
- 手动创建第一个OC程序
手动创建第一个OC程序 创建一个文件夹,文件夹内创建一个a.m的OC源文件,并编辑 之前说过,OC是完全兼容C语言的,那么我们先写个下面的程序尝试一下 #include<stdio.h> ...
- Hive基本原理及环境搭建
今天我主要是在折腾这个Hive,早上看了一下书,最开始有点凌乱,后面慢慢地发现,hive其实挺简单的,以我的理解就是和数据库有关的东西,那这样的话对我来说就容易多啦,因为我对sql语法应该是比较熟悉了 ...
- TensoFlow实现条件语句
import tensorflow as tf a = tf.constant(20) b = tf.constant(10) result1 = tf.cond(a > b, lambda: ...
- iOS 10 适配 ATS
一. HTTPS 其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的 ...
- Hibernate之实体关系映射
延迟加载与即时加载 例如Person类和Email类是一对多关系,如果设为即时加载,当加载Person时,会自动加载Email,如果设置为延迟加载,当第一次调用person.getEmails()时才 ...
- springmvc注解形式的开发参数接收
springmvc基于注解的开发 注解第一个例子 1. 创建web项目 springmvc-2 2. 在springmvc的配置文件中指定注解驱动,配置扫描器 <!-- sprimgmvc 注解 ...
- 验证码程序Demo
小伙伴都有这样的经历,册各种网站,总是输不对验证码,双十一那天狂买的小伙伴是不是对输入验证码有着不一样的感触呢,以前觉得验证码真是个麻烦鬼,一个不小心,一个眼拙,哎呦,没有输入正确,又是一阵子大眼瞪小 ...
- Java Socket输入流如何检测到EOF
对于InputStream的 read(b, off, len) 方法 public int read(byte[] b, int off, int len) throws IOException,J ...
- 【ShaderToy】基础篇之再谈抗锯齿(antialiasing,AA)
写在前面 在之前的基础篇中,我们讲到了在绘制点线时如何处理边缘的锯齿,也就是使用smoothstep函数.而模糊参数是一些定值,或者是跟屏幕分辨率相关的数值,例如分辨率宽度的5%等等.但这种方法其实是 ...