在本系列的第一篇文章中,我们介绍了国产列式数据库GBase 8a,下面来介绍它的孪生兄弟,加拿大Infobright公司的同名数据库。Infobright明确宣称它是一个基于MySQL(based)的列存储数据库,其出现也有一段时间了,最新稳定版是2010年7月份发布的3.4.2,上一个稳定版本是2010年2月推出的,但在国内它比起MySQL来还不是很出名,可能跟列存储的宣传有关。我也是用了GBase才在MySQL网站上找到了这么一个信息,http://www.mysql.com/partners/storage-engines/与之并列的还有Calpont公司的InfiniDB,那个产品将在下一篇文章介绍。
一、安装
Infobright在其网站上提供了社区版和30天试用企业版的下载,也提供了一些使用手册文档下载,这为用户试用带来了方便,更值得一提的,它提供了论坛(社区)的支持,只要略懂一些英文,就可以在上面提问,得到公司的技术支持和其他热心网友的帮助。
通过文档我们了解到,企业版比社区版具有更多的功能和更好的扩展性。因此我们首先试用企业版,以最大限度地了解这个产品的全部功能。在infobright.com网站注册一个免费用户就可以得到企业试用版安装文件和30天试用授权文件。安装文件有windows 32位, windows 64位, linux 32位,linux 64位等4种,我用于测试的机器是一台4颗6核CPU的PC服务器,操作系统是简体中文Windows 2008 R2标准版,因此选用的安装文件是infobright-3.4.2-p2-win_64-eval.zip (18,161,823 字节),这是一个x64平台的安装文件,与目前其他主流商用数据库动辄几百兆甚至几个G的安装文件比起来,这是一个相当小的安装文件。安装界面全是图形交互式的,很简单,一路Next就安装完成了。
安装完成以后,在开始/所有程序下新增了一个Infobright的菜单项,有服务器启动、关闭的快捷方式,数据库后台服务默认是自动开启的。与GBase不同,它的安装不包括图形化管理工具,只提供了命令行界面的客户端和其他工具。
按惯例,先看一下数据库安装在磁盘上的文件和目录。
D:Infobright 的目录
▲
如上图所示,安装程序在磁盘上创建了几个目录和一些文件。其中3个批处理文件,分别用于Infobright后台服务的启动和关闭,客户端的启动。bin目录下面是实际的可执行文件,除了基本的还包括多种MySQL实用工具,如mysqladmin。Iblicense-xxxx.lic文件是授权文件,必须把它放到Infobright安装目录下,否则企业版无法启动。
利用已有的MySQL知识,我们也可以用控制台方式启动Infobright,这种方式可以更详细地观察服务器的启动过程,如果启动出错,可以根据出错信息的提示排除错误。
▲
用客户端连接可以不指定端口或指定5029端口。默认root用户没有口令。
▲
我们观察到infobright采用的MySQL版本是5.1.40,下面创建一个test数据库,然后在其中创建一个表t,可以观察到默认的存储引擎是BRIGHTHOUSE。
再来观察t表对应的数据文件物理存储,在datatest目录下创建了t.frm文件和t.bht目录。t.bht下面有许多文件,绝大部分都是数字序号编排的ctb文件。我们的表t有5列,分别对应TA00000- TA00004,每列有4个文件。前2个文件基本不随记录的行数增加而变化,从TA*00000001.ctb开始保存多个数据块,如果超过单个文件的限制,还会增加数据文件。参考http://www.infobright.org/wiki/File:IB_Arch_ICE_white_paper_0809.pdf/。
这里我们看到了infobright引以为傲的业界最高的压缩比。100万行记录才740多K,平均每行占用0.7个字节。当然,这和我们数据的组成太有规律有关。
▲
▲
这里我们看到了infobright引以为傲的业界最高的压缩比。100万行记录才740多K,平均每行占用0.7个字节。当然,这和我们数据的组成太有规律有关。
如果你还记得上一篇GBase的目录结构和文件命名方式,可以发现它们有异曲同工之妙。后缀名为frm的文件是表结构定义文件,GED后缀的目录下存放着Gbase的数据文件。
前面介绍了企业版,下面 尝试一下社区版,看它们到底有哪些区别。社区版无需注册用户就可直接从infobright.org网页下载,3.4.2版安装包的下载地址为:http://www.infobright.org/downloads/ice/infobright-3.4.2-win_64-ice.zip 。同时也提供源代码的下载,不过对普通用户没有什么用处。值得注意的是,如果在一台机器上安装不同的版本,即使安装到不同的目录,那么infobright的Windows服务指向最后安装的那个版本,如果用sc start infobright命令启动,则总是启动最后安装的版本。这和Oracle允许多个版本的数据库实例具有不同的Windows服务名不同。 二、数据库的功能
数据库的基本功能有CRUD(表的创建、插入、更新、删除)等方面,下面我们逐个测试。
Infobright文档指出了它支持的数据类型和取值范围为:
Numeric Types Min Value Max Value
TINYINT -127 127
BOOL, BOOLEAN -127 127
SMALLINT -32767 32767
MEDIUMINT -8388608 8388607
INT -2147483647 2147483647
BIGINT -9223372036854775806 9223372036854775806
FLOAT -3.402823466E+38 3.402823466E+38
DOUBLE (DOUBLE PRECISION) -1.7976931348623157E+308 1.7976931348623157E+308
DEC (M,D) -(1.0E+M - 1)/(1.0E+D) (1.0E+M - 1)/(1.0E+D)
WHERE 0
Date and Time Types Min Value Max Value Format
DATE 100-01-01 9999-12-31 YYYY-mm-dd
DATETIME 100-01-01 00:00:00 9999-12-31 23:59:59 YYYY-mm-dd HH:MM:SS
TIMESTAMP 1970-01-01 00:00:00 2038-01-01 00:59:59 YYYY-mm-dd HH:MM:SS
TIME -838:59:59 838:59:59 HHH:MM:SS
YEAR (4-digit format only) 1901 2155 YYYY
String Types Max Value
CHAR(N) 255
VARCHAR(N) 65532
BINARY(N) 255
VARBINARY(N) 65532
TINYTEXT 255
TEXT(N) 65535
我们可以发现,精确的数值类型DEC最大长度是18位,这实际上存储的是8字节长整型数,通过与小数位数的设定配合表达一个精确的小数,如果需要更大的数据范围,而精度要求可以降低,则可以用DOUBLE数据类型。
下一步是插入数据,企业版数据加载还采用MySQL的load data infile命令。默认的加载程序是MySQL原始的工具,不过你可以通过修改环境变量实现用infobright的加载程序,后者性能更高,参见下一节测试的结果。
对于比较规律的测试数据,可以通过存储过程产生,语法规则和MySQL的一致,由于brighthouse引擎的DML速度比较慢,同样需要设置自动提交开关为关闭,方能取得较好的插入性能。
DELIMITER |
CREATE PROCEDURE `test`.`insert_1K`
( )
BEGIN
DECLARE v INT;
SET v = 1;
loop_label: LOOP
INSERT INTO t VALUES (mod(v,4),mod(v,5),mod(v,67),mod(case when mod(v,13)>0 then v end ,113),v);
SET v = v + 1;
IF v > 1000 THEN
LEAVE loop_label;
END IF;
END LOOP;
END |
mysql> set autocommit=on;
Query OK, 0 rows affected (0.00 sec)
mysql> call insert_1K_ ();
Query OK, 1 row affected (33.94 sec)
mysql> truncate table t;
Query OK, 0 rows affected (0.00 sec)
mysql> set autocommit=off;
Query OK, 0 rows affected (0.00 sec)
mysql> call insert_1K ();
Query OK, 1 row affected (0.08 sec)
mysql> select count(*) from t;
+----------+
| count(*) |
+----------+
| 1000 |
+----------+
1 row in set (0.03 sec)
mysql> commit;
Query OK, 0 rows affected (0.02 sec)
Infobright支持中文,不过需要做一些设置。
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)
mysql> create table thz(a varchar(100))DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.00 sec)
mysql> show create table thz;
+-------+--------------------
| thz | CREATE TABLE `thz` (
`a` varchar(100) DEFAULT NULL
) ENGINE=BRIGHTHOUSE DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
mysql> insert into thz values('入门');
Query OK, 1 row affected (0.00 sec)
mysql> insert into thz values('文献');
Query OK, 1 row affected (0.00 sec)
mysql> select * from thz order by 1;
+------+
| a |
+------+
| 入门 |
| 文献 |
+------+
2 rows in set (0.06 sec)
mysql> select * from thz order by 1 desc;
+------+
| a |
+------+
| 文献 |
| 入门 |
+------+
2 rows in set (0.00 sec)
Infobright的事务处理实现与Oracle的类似,但默认是自动提交的,可设置不自动提交事务,默认是在会话级的。设置不自动提交事务以后,本会话可以脏读,其他会话则只能查询到最后一次提交时的内容。如果多个会话对同一个表执行dml操作,后发出的命令被挂起,等候前一个会话提交或回滚才能执行。大部分和Oracle的表现一致,就不一一举例了。
企业版和社区版最显著的区别在于前者支持brighthouse存储引擎的DML操作,这就意味着其他存储引擎的表数据无法在数据库内部转移到brighthouse存储引擎的表中,反之则不然。但对一个面向数据仓库应用的数据库,毕竟主要业务是查询而不是数据修改,问题也不大。实在需要DML操作可以用导入导出迂回进行,insert操作的替代方法如下。
mysql> show create table t; /*t表是BRIGHTHOUSE引擎,无法执行DML操作*/
+-------+--------------------
| t | CREATE TABLE `t` (
`c1` int(11) DEFAULT NULL,
`c2` int(11) DEFAULT NULL,
`c3` int(11) DEFAULT NULL,
`c4` int(11) DEFAULT NULL,
`v` bigint(20) DEFAULT NULL
) ENGINE=BRIGHTHOUSE DEFAULT CHARSET=latin1 COLLATE=latin1_bin |
1 row in set (0.00 sec)
mysql> call insert_1K(); /*insert操作提示出错*/
ERROR 1031 (HY000): Table storage engine for 't' doesn't have this option
mysql> create table tisam engine=myisam as select * from t ;/*根据表结构创建MyISAM临时表*/
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> call insert_1k_isam(); /*将数据插入临时表*/
Query OK, 1 row affected (0.03 sec)
mysql> select count(*)from tisam;
+----------+
| count(*) |
+----------+
| 1000 |
+----------+
1 row in set (0.00 sec)
mysql> select * from tisam into outfile 'd:/app/tisam.csv'; /*将临时表数据导出为文件*/
Query OK, 1000 rows affected (0.00 sec)
mysql> load data infile 'd:/app/tisam.csv' into table t; /*默认分隔符是','*/
ERROR 2 (HY000): Wrong data or column definition. Row: 1, field: 1.
mysql> load data infile 'd:/app/tisam.csv' into table t fields terminated by 't';
Query OK, 1000 rows affected (0.36 sec)
Records: 1000 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select count(*) from t;
+----------+
| count(*) |
+----------+
| 1000 |
+----------+
令人费解的,加载文件的默认分隔符是',',与导出文件的默认分隔符't'不一致,而企业版却是一致的,都是't'。由于truncate table 操作也不支持,delete和update操作要通过先drop表,再加载文件的方式进行。
Infobright和原始MySQL的SQL解释、执行引擎不同,因此,不支持包含brighthouse的表和其他数据引擎的表的关联操作,其他原始MySQL的数据引擎之间的操作则不在此限。估计若不涉及brighthouse引擎的查询调用的是原始MySQL的SQL解释、执行引擎。
mysql> select count(t.c1) from t,tisam where t.v=tisam.v;
ERROR 5 (HY000): The query includes syntax that is not supported by the Infobright Optimizer. Either restructure the query with supported syntax, or enable
the MySQL Query Path in the brighthouse.ini file to execute the query with reduced performance.
mysql> select count(t.c1) from t,t t2 where t.v=t2.v;
+-------------+
| count(t.c1) |
+-------------+
| 1000 |
+-------------+
1 row in set (0.03 sec)
mysql> select count(t.c1) from t join tisam on t.v=tisam.v;
ERROR 5 (HY000): The query includes syntax that is not supported by the Infobright Optimizer. Either restructure the query with supported syntax, or enable
the MySQL Query Path in the brighthouse.ini file to execute the query with reduced performance.
mysql> select count(t.c1) from tisam t,tisam t2 where t.v=t2.v;
+-------------+
| count(t.c1) |
+-------------+
| 1000 |
+-------------+
1 row in set (0.11 sec)
mysql> create table tmem engine=memory as select c1,sum(v) sumv from t group by c1;
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select count(*) from tisam t,tmem t2 where t.c1=t2.c1;/*不涉及brighthouse引擎*/
+----------+
| count(*) |
+----------+
| 1000 |
+----------+
1 row in set (0.00 sec)
社区版还提供3.5 beta版供用户测试,而企业版没有。
三、数据加载和查询性能
为了提供用户在做数据库选型的参考,下面沿用TPC-H 2.8 scale为1的大约1G字节数据来进行较大数据量的测试,先进行数据加载测试,MySQL原始加载工具的性能表现已经可以接受了。
mysql> load data infile 'C:/soft/Tcp-h_windows/lineitem.tbl' into table lineitem fields terminated by '|' lines terminated by '|rn';
Query OK, 6001215 rows affected (4 min 34.94 sec)
通过设置BH_DATAFORMAT环境变量,改用infobright的数据加载工具。其中二进制方式需要企业版才能支持。社区版只能采用infobright的数据加载工具加载文本。
mysql> set @BH_DATAFORMAT='binary';/*二进制方式*/
Query OK, 0 rows affected (0.00 sec)
mysql> use tpch
Database changed
mysql> select * from lineitem into outfile 'c:/app/lineitem.bin';
Query OK, 6001215 rows affected (4 min 11.80 sec)
mysql> truncate table lineitem;
Query OK, 0 rows affected (0.03 sec)
mysql> load data infile 'c:/app/lineitem.bin' into table lineitem;
Query OK, 6001215 rows affected (48.83 sec)
mysql> set @BH_DATAFORMAT='txt_variable';/*利用infobright加载文本*/
Query OK, 0 rows affected (0.00 sec)
mysql> truncate table lineitem;
Query OK, 0 rows affected (0.03 sec)
mysql> load data infile 'C:/soft/Tcp-h_windows/lineitem.tbl' into table lineitem fields terminated by '|' lines terminat
ed by '|rn';
Query OK, 6001215 rows affected (1 min 35.05 sec)
如果要恢复原始的MySQL加载工具,设置BH_DATAFORMAT环境变量为'mysql'。
数据加载后,tpch数据库的大小为169 MB (177,304,450 字节) ,压缩比约18%。
下面是查询测试结果。由于64位企业版无法启动,改用配置稍低的32位服务器,因此绝对时间与前面的GBase和Oracle不可比,只说明大致的趋势。
表1 TPC-H 2.8 scale=1的测试对比,单位:秒▲
*修改SQL为等价的方式后3.63秒。
如上表所示,infobright在22个测试项目全都落后于Oracle,但有3个比GBase用时短。只有1个测试项目未执行成功,比GBase的2个未执行成功要少。有6个项目执行时间远远长于Oracle,有时通过修改SQL的写法可以获得较好的性能,比如下面第20个查询,通过把第2个in子查询改为关联,执行时间缩短到原来的200分之一。
/*修改前的第20个查询语句*/
select s_name, s_address
from supplier, nation
where s_suppkey in (select ps_suppkey
from partsupp
where ps_partkey in (select p_partkey
from part
where p_name like 'forest%')
and ps_availqty > (select 0.5 * sum(l_quantity)
from lineitem
where l_partkey = ps_partkey
and l_suppkey = ps_suppkey
and l_shipdate >= date '1994-01-01'
and l_shipdate < date '1994-01-01' + interval '1' year))
and s_nationkey = n_nationkey
and n_name = 'CANADA'
order by s_name
limit 100;
/*修改后的第20个查询语句*/
select s_name, s_address
from supplier, nation
where s_suppkey in (select ps_suppkey
from partsupp
,(select l_partkey,l_suppkey, sum(l_quantity) l_quantity_SUM
from lineitem,part
where l_partkey = p_partkey and p_name like 'forest%'
and l_shipdate >= date '1994-01-01'
and l_shipdate < date '1994-01-01' + interval '1' year
GROUP BY l_partkey,l_suppkey
)a
where l_partkey = ps_partkey
and l_suppkey = ps_suppkey
and ps_availqty > 0.5*l_quantity_SUM
)
and s_nationkey = n_nationkey
and n_name = 'CANADA'
order by s_name
limit 100;
四、结束语
看到这里,相信读者对Infobright已经有了初步的印象,无论是企业版还是社区版,数据压缩都非常强悍,SQL的兼容性也不错,在brighthouse引擎内部,各种内外关联、子查询都支持,tpc-h的22个SQL,除了limit -1这种写法不被支持,只有#1,#13需要修改。至于查询性能,表现平平,几个耗时特别长的查询和GBase的一致。由于测试的项目有限,现有的测试未观察到企业版在多线程上的表现比社区版没有明显的区别。二种版本具体区别详情参考http://www.infobright.org/Learn-More/ICE_IEE_Comparison/。
要说最大的问题,就是服务器的稳定性,我的测试机企业版经常出现授权文件非法的奇异错误,导致服务器无法启动,社区版要好一些,因为不存在授权文件的问题。
总的来说,如果用户十分在意存储空间,对查询速度要求一般,那么Infobright是一个好的选择。而对最终用户来说,缺少图形化的管理工具也是一个不容忽视的问题。其次,infobright对SQL的编写要求较高,如果需要高效的查询,需要开发人员有较丰富的经验。
对于有能力的用户,社区版是更好的选择,它虽然有些功能不如企业版,但它免费,而且提供了源代码,用户可以基于它作个性化的修改,以满足自己特殊的需要。
|