一、安裝
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表對應的數據文件物理存儲,在data\test目錄下創建了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 '|\r\n'; 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 '|\r\n'; 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的編寫要求較高,如果需要高效的查詢,需要開發人員有較豐富的經驗。
對於有能力的用戶,社區版是更好的選擇,它雖然有些功能不如企業版,但它免費,而且提供了源代碼,用戶可以基於它作個性化的修改,以滿足自己特殊的需要。