1. 概述mysql
Infobright是一款基於獨特的專利知識網格技術的列式數據庫。Infobright簡單易用,快速安裝部署,使用中無需複雜操做,能大幅度減小管理工做;在應對50TB甚至更多數據量進行多併發複雜查詢時,更可以顯示出使人驚歎的速度。相比於MySQL,其查詢速度提高了數倍甚至數十倍,在同類產品中單機性能處於領先地位。爲企業劇增的數據規模、增加的客戶需求以及較高的用戶指望提供了全面的解決方案。程序員
2. Infobright特徵算法
優勢:
1)大數據量查詢性能強勁、穩定:查詢性能高,如百萬、千萬、億級記錄數條件下,同等的SELECT查詢語句,速度比MyISAM、InnoDB等普通的MySQL存儲引擎快5~60倍。高效查詢主要依賴特殊設計的存儲結構對查詢的優化,但這裏優化的效果還取決於數據庫結構和查詢語句的設計。
2)存儲數據量大:TB級數據大小,幾十億條記錄。數據量存儲主要依賴本身提供的高速數據加載工具(百G/小時)和高數據壓縮比(>10:1)
3)高數據壓縮比:號稱平均可以達到 10:1 以上的數據壓縮率。甚至能夠達到40:1,極大地節省了數據存儲空間。高數據壓縮比主要依賴列式存儲和 patent-pending 的靈活壓縮算法。
4)基於列存儲:無需建索引,無需分區。即便數據量十分巨大,查詢速度也很快。用於數據倉庫,處理海量數據沒一套可不行。不須要建索引,就避免了維護索引及索引隨着數據膨脹的問題。把每列數據分塊壓縮存放,每塊有知識網格節點記錄塊內的統計信息,代替索引,加速搜 索。
5)快速響應複雜的聚合類查詢:適合複雜的分析性SQL查詢,如SUM, COUNT, AVG, GROUP BY
sql
限制:
1)不支持數據更新:社區版Infobright只能使用「LOAD DATA INFILE」的方式導入數據,不支持INSERT、UPDATE、DELETE。shell
這使對數據的修改變得很困難,這樣就限制了它做爲實時數據服務的數據倉庫來使用。用戶要麼忍受數據的非實時或非精確,這樣對最(較)新數據的分析準確性就下降了許多;要麼將它做爲歷史庫來使用,帶來的問題是實時庫用什麼?不少用戶選擇數據倉庫系統,不是由於存儲空間不夠,而是數據加載性能和查詢性能沒法知足要求。
2)不支持高併發:只能支持10多個併發查詢
數據庫
雖然單庫 10 多個併發對通常的應用來講也足夠了,但較低的機器利用率對投資者來講老是一件不爽的事情,特別是在併發小請求較多的狀況下。
bootstrap
3). 沒有提供主從備份和橫向擴展的功能。安全
若是沒有主從備份,想作備份的話,也能夠主從同時加載數據,但只能校驗最終的數據一致性,這會使得從機在數據加載時停服務的時間較長;橫向擴展方面,倒不是 Infobright 的錯,它自己就不是分佈式的存儲系統,但若是把它搞成一個分佈式的系統,應該是一件比較好玩的事情。服務器
不支持數據更新。 這個限制對於咱們即要求查詢性能外還要對數據庫進行寫入的需求, 形成了很大的不變。 這個估計是不少人試用後放棄試用ICE的第一個緣由。
4). 不支持對多核的使用。 不但不支持查詢的多併發,並且連導入導出也沒有這樣的支持。這個也是放棄ICE的一個緣由。 誰也不肯意本身的強勁的硬件只能被用到1%。
網絡
與MySQL對比:
一、infobright適用於數據倉庫場合:即非事務、非實時、非多併發;分析爲主;存放既定的事實(基本不會再變),例如日誌,或彙總的大量的 數據。因此它並不適合於應對來自網站用戶的請求。實際上它取一條記錄比mysql要慢不少,但它取100W條記錄會比mysql快。
二、mysql的總數據文件佔用空間一般會比實際數據多,由於它還有索引。infobright的壓縮能力很強大,按列按不一樣類型的數據來壓縮。
三、服務形式與接口跟mysql一致,能夠用相似mysql的方式啓用infobright服務,而後原來鏈接mysql的應用程序均可以以相似的 方式鏈接與查詢infobright。這對熟練mysql者來講是個福音,學習成本基本爲0。
infobright有兩個發佈版:開源的ICE及閉源商用的IEE。ICE提供了足夠用的功能,但不能 INSERT,DELETE,UPDATE,只能LOAD DATA INFILE。IEE除提供更充分的功能外,聽說查詢速度也要更快。
3. 架構
下面是Infobright的架構圖:
2)Knowledge Node裏面存儲着指向DP之間或者列之間關係的一些元數據集合,好比值發生的範圍(MIin_Max)、列數據之間的關聯。大部分的KN數據是裝載數據的時候產生的,另一些事是查詢的時候產生。
Knowledge Grid構架是Infobright高性能的重要緣由。
Knowledge Grid可分爲四部分,DPN、Histogram、CMAP、P-2-P。
DPN如上所述。Histogram用來提升數字類型(好比date,time,decimal)的查詢的性能。Histogram是裝載數據的時候就產生的。DPN中有mix、max,Histogram中把Min-Max分紅1024段,若是Mix_Max範圍小於1024的話,每一段就是就是一個單獨的值。這個時候KN就是一個數值是否在當前段的二進制表示。
Histogram的做用就是快速判斷當前DP是否知足查詢條件。如上圖所示,好比select id from customerInfo where id>50 and id<70。那麼很容易就能夠獲得當前DP不知足條件。因此Histogram對於那種數字限定的查詢可以頗有效地減小查詢DP的數量。
CMAP是針對於文本類型的查詢,也是裝載數據的時候就產生的。CMAP是統計當前DP內,ASCII在1-64位置出現的狀況。以下圖所示
好比上面的圖說明了A在文本的第二個、第三個、第四個位置歷來沒有出現過。0表示沒有出現,1表示出現過。查詢中文本的比較歸根究底仍是按照字節進行比較,因此根據CMAP可以很好地提升文本查詢的性能。
Pack-To-Pack是Join操做的時候產生的,它是表示join的兩個DP中操做的兩個列之間關係的位圖,也就是二進制表示的矩陣。
Knowledge Grid仍是比較複雜的,裏面還有不少細節的東西,能夠參考官方的白皮書和Brighthouse: an analytic data warehouse for ad-hoc queries這篇論文。
4. 數據類型
5. 工做原理
粗糙集(Rough Sets)是Infobright的核心技術之一。Infobright在執行查詢的時候會根據知識網絡(Knowledge Grid)把DP分紅三類:
相關的DP(Relevant Packs),知足查詢條件限制的DP
不相關的DP(Irrelevant Packs),不知足查詢條件限制的DP
可疑的DP(Suspect Packs),DP裏面的數據部分知足查詢條件的限制
下面是一個案例:
如圖所示,每一列總共有5個DP,其中限制條件是A>6。因此A一、A二、A4就是不相關的DP,A3是相關的DP,A5是可疑的DP。那麼執行查詢的時候只須要計算B5中知足條件的記錄的和而後加上Sum(B3),Sum(B3)是已知的。此時只須要解壓縮B5這個DP。從上面的分析能夠知道,Infobright可以很高效地執行一些查詢,並且執行的時候where語句的區分度越高越好。where區分度高能夠更精確地確認是不是相關DP或者是不相關DP亦或是能夠DP,儘量減小DP的數量、減小解壓縮帶來的性能損耗。在作條件判斷的使用,通常會用到上一章所講到的Histogram和CMAP,它們可以有效地提升查詢性能。
多表鏈接的的時候原理也是類似的。先是利用Pack-To-Pack產生join的那兩列的DP之間的關係。
好比:SELECT MAX(X.D) FROM T JOIN X ON T.B = X.C WHERE T.A > 6。Pack-To-Pack產生T.B和X.C的DP之間的關係矩陣M。假設T.B的第一個DP和X.C的第一個DP之間有元素交叉,那麼M[1,1]=1,不然M[1,1]=0。這樣就有效地減小了join操做時DP的數量。
前面降到了解壓縮,順便提一提DP的壓縮。每一個DP中的64K個元素被當成是一個序列,其中全部的null的位置都會被單獨存儲,而後其他的non-null的數據會被壓縮。數據的壓縮跟數據的類型有關,infobright會根據數據的類型選擇壓縮算法。infobright會自適應地調節算法的參數以達到最優的壓縮比。
6. 壓縮比例
Infobright號稱數據壓縮比率是10:1到40:1。前面咱們已經說過了Infobright的壓縮是根據DP裏面的數據類型,系統自動選擇壓縮算法,而且自適應地調節算法的參數以達到最優的壓縮比。
先看看在個人實驗環境下的壓縮比率,以下圖所示:
相信讀者能夠很清楚地看到,總體的壓縮比率是20.302。可是這裏有一個誤區,這裏的壓縮比率指的是數據庫中的原始數據大小/壓縮後的數據大小,而不是文本文件的物理數據大小/壓縮後的數據大小。很明顯前者會比後者大出很多。在個人實驗環境下,後者是7:1左右。通常來講文本數據存入數據庫以後大小會比原來的文本大很多,由於有些字段被設置了固定長度,佔用了比實際更多的空間。還有就是數據庫裏面會有不少的統計信息數據,其中就包括索引,這些統計信息數據佔據的空間絕對不小。Infobright雖然沒有索引,可是它有KN數據,一般狀況下KN數據大小佔數據總大小的1%左右。
既然Infobright會根據具體的數據類型進行壓縮,那咱們就看看不一樣的數據類型具備什麼樣的壓縮比率。以下表所示:
首先看看Int類型的壓縮比率,結果是壓縮比率上Int<mediumint<smallint。細心地讀者會很容易發現tinyint的壓縮比率怎麼會比int還小。數據壓縮比率除了和數據類型有關以外,還和數據的差別性有特別大關係,這是顯而易見。posFlag只有0,1,-1三種可能,這種數據顯然不可能取得很好的壓縮比率。
再看看act字段,act字段使用了comment lookup,比簡單的char類型具備更佳的壓縮比率和查詢性能。comment lookup的原理其實比較像位圖索引。對於comment lookup的使用下一章節將細細講述。
在全部的字段當中date字段的壓縮比率是最高的,最後數據的大小隻有0.1M。varchar的壓縮比率就比較差了,因此除非必要,否則不建議使用varchar。
上面的數據很清楚地展現了Infobright強大的壓縮性能。在此再次強調,數據的壓縮不僅是和數據類型有關,數據的差別程度起了特別大的做用。在選擇字段數據類型的時候,我的以爲性能方面的考慮應該擺在第一位。好比上面表中一些字段的選擇就能夠優化,ip能夠改成bigint類型,date甚至能夠根據須要拆分紅year/month/day三列。
6. comment lookup的使用
comment lookup只能顯式地使用在char或者varchar上面。Comment Lookup能夠減小存儲空間,提升壓縮率,對char和varchar字段採用comment lookup能夠提升查詢效率。
Comment Lookup實現機制很像位圖索引,實現上利用簡短的數值類型替代char字段已取得更好的查詢性能和壓縮比率。CommentLookup的使用除了對數據類型有要求,對數據也有必定的要求。通常要求數據類別的總數小於10000而且當前列的單元數量/類別數量大於10。Comment Lookup比較適合年齡,性別,省份這一類型的字段。
comment lookup使用很簡單,在建立數據庫表的時候以下定義便可:
act char(15) comment 'lookup',
part char(4) comment 'lookup',
7. 查詢優化
(1)配置環境
在Linux下面,Infobright環境的配置能夠根據README裏的要求,配置brighthouse.ini文件。
(2) 選取高效的數據類型
參見前面章節。
(3)使用comment lookup
參見前面章節。
(4)儘可能有序地導入數據
前面分析過Infobright的構架,每一列分紅n個DP,每一個DPN列面存儲着DP的一些統計信息。有序地導入數據可以使不一樣的DP的DPN內的數據差別化更明顯。好比按時間date順序導入數據,那麼前一個DP的max(date)<=下一個DP的min(date),查詢的時候就可以減小可疑DP,提升查詢性能。換句話說,有序地導入數據就是使DP內部數據更加集中,而再也不那麼分散。
(5)使用高效的查詢語句。
這裏涉及的內容比較多了,總結以下:
儘可能不適用or,能夠採用in或者union取而代之
減小IO操做,緣由是infobright裏面數據是壓縮的,解壓縮的過程要消耗不少的時間。
查詢的時候儘可能條件選擇差別化更明顯的語句
Select中儘可能使用where中出現的字段。緣由是Infobright按照列處理的,每一列都是單獨處理的。因此避免使用where中未出現的字段能夠獲得較好的性能。
限制在結果中的表的數量,也就是限制select中出現表的數量。
儘可能使用獨立的子查詢和join操做代替非獨立的子查詢
儘可能不在where裏面使用MySQL函數和類型轉換符
儘可能避免會使用MySQL優化器的查詢操做
使用跨越Infobright表和MySQL表的查詢操做
儘可能不在group by 裏或者子查詢裏面使用數學操做,如sum(a*b)。
select裏面儘可能剔除不要的字段。
Infobright執行查詢語句的時候,大部分的時間都是花在優化階段。Infobright優化器雖然已經很強大,可是編寫查詢語句的時候不少的細節問題仍是須要程序員注意。
七、IB安裝
一、下載
wget http://www.infobright.org/downloads/ice/infobright-4.0.7-0-src-ice.tar.gz
二、tar zxvf infobright-4.0.7-0-src-ice.tar.gz
三、能夠在目錄infobright-4.0.7-0看到README文件
這麼有安裝說明,不過須要注意幾點,用紅色標註
Infobright Installation Using a Source Distribution
===================================================
* Menu:
* Source Installation Overview
* Dealing with Problems Compiling Infobright
1、須要的環境
You need the following tools to build and install MySQL and Infobright from source:
* A working gcc compiler (recomended version is 4.2.x).
* Properly installed autoconf and other gnu tools such as aclocal, autoheader, libtool(1.5.22), automake,
autoconf (2.59), autoreconf (2.59), make (3.81), m4 - macro preprocessor(1.4.5), libncurses5, libncurses5-dev, zlib,
zlib-devel, perl, bison etc.
* boost 1.42 or higher (required boost-regex*, boost-program-options*,
boost_thread*, boost_filesystem*, boost_system*). In Infobright we compile boost using the following steps
wget http://jaist.dl.sourceforge.net/project/boost/boost/1.50.0/boost_1_50_0.tar.gz
- download boost 1.50 and unpack it:tar -zxvf boost_1_50_0.tar.gz
- cd to unpacked folder: cd boost_1_42_0
- ./bootstrap.sh --prefix=/usr/local/boost_1_42_0
- ./bjam install
- export BOOST_ROOT=/usr/local/boost_1_42_0
這個必定按這個順利執行,不然有可能出錯
</pre><span style="color:#666666">2、源碼安裝:</span><p></p><p style="font-family:Arial; font-size:14px; line-height:26px"><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,u5b8bu4f53; font-size:16px; line-height:28px"><span style="font-family:verdana,arial,sans-serif; background-color:rgb(249,249,249)"><span style="color:rgb(102,102,102)">Source Installation Overview</span><span style="color:rgb(102,102,102)">----------------------------------</span><span style="color:rgb(102,102,102)">The basic commands that you must execute to compile and install a MySQL and Infobright source</span><span style="color:rgb(102,102,102)">distribution are:</span><span style="color:rgb(102,102,102)"> shell> groupadd mysql</span><span style="color:rgb(102,102,102)"> shell> useradd -g mysql mysql</span><span style="color:rgb(102,102,102)"> # To compile and install MySQL and Infobright server and client tools</span><span style="color:rgb(102,102,102)"> shell> cd <span style="color:rgb(102,102,102); font-family:verdana,arial,sans-serif; font-size:16px; line-height:28px; background-color:rgb(249,249,249)">infobright-4.0.7-0</span></span><span style="color:rgb(255,0,0)"> shell> make </span></span></span><span style="color:rgb(255,0,0)"><span style="background-color:rgb(240,240,240); line-height:21px; font-family:verdana,arial,sans-serif; font-size:16px">PREFIX=/usr/local/infobright </span><span style="font-size:16px; background-color:rgb(249,249,249); font-family:verdana,arial,sans-serif; line-height:28px">EDITION=community release</span><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,u5b8bu4f53; font-size:16px; line-height:28px"><span style="font-family:verdana,arial,sans-serif; background-color:rgb(249,249,249)"> shell> make </span></span><span style="background-color:rgb(240,240,240); line-height:21px; font-family:verdana,arial,sans-serif; font-size:16px">PREFIX=/usr/local/infobright </span><span style="font-size:16px; background-color:rgb(249,249,249); font-family:verdana,arial,sans-serif; line-height:28px">EDITION=community install-release</span></span><span style="color:rgb(51,51,51); font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,u5b8bu4f53; font-size:16px; line-height:28px"><span style="font-family:verdana,arial,sans-serif; background-color:rgb(249,249,249)"><span style="color:#666666"></span></span></span></p><pre name="code" class="plain" style="margin-top: 0px; margin-bottom: 10px; background-color: rgb(255, 255, 255); color: rgb(255, 102, 0); font-size: 13px; line-height: 24px;">
# make -j 8 PREFIX=/usr/local/infobright EDITION=community release # make -j 8 PREFIX=/usr/local/infobright EDITION=community install-release
make -j 8 表示使用服務器的8個核並行編譯
PREFIX=/usr/local/infobright 指定安裝路徑
若是報錯:error while loading shared libraries: libboost_filesystem.so.1.42.0: cannot open shared object file: No such file or directory
執行:
shell> echo /usr/local/boost_1_42_0/lib>> /etc/ld.so.conf.d/boost_lib.conf
shell> ldconfig
shell> chown -R root .
shell> chown -R mysql var cache
shell> chgrp -R mysql .
shell> `pwd`/libexec/mysqld --defaults-file=/etc/my-ib.cnf --user=mysql
安裝啓動腳本:
shell> cp share/mysql/mysql.server /etc/init.d/mysqld-ib
shell> vi /etc/init.d/mysqld-ib
初始化ib實例的密碼
/usr/local/infobright/bin/mysqladmin -u root password "123456"
7. 數據導入
對於DW系統而言,龐大數據的遷移成本很高;因此導入和導出的速率及容忍性也是考量數據倉庫產品的重要標準。Infobright基於MySQL因此在數據格式上有比較成型的解決辦法,IB原廠對速率進行了優化。在4.0企業版中推出了DLP分佈式導入選件,極大的減小了遷移時間,目前世界最大的光通訊提供商JDSU也選用了IB產品,並以DLP爲主要選件進行配置。
一、簡介
IB提供了專用的高性能loader,不一樣於傳統的mysql。IB loader是爲了提升導入速度而設計的,因此僅支持特有的mysql loader語法,並且只支持導入格式化的變量和文本源文件.IEE版也支持mysqlloader和insert語句。infobright對txt的格式有很是嚴格的要求,格式不對是不能導入數據的。
二、默認Loader
1)ICE僅支持IB lorder
2)IEE默認使用的是是mysql loader,它能更多的容錯,但速度稍慢。爲了最快的導入,使用IB loader,作如下環境的設置
導入步驟:
1)、建表:
mysql>
create table example2 ( id int not null, textfield varchar(20) not null, number int not null )engine=birghthouse;
Mysql>
set @bh_dataformat = ‘txt_variable’;
–使用IB loader來導入CSV格式的變量定長文本
set @bh_dataformat = ‘binary’;
–二進制文件
set @bh_dataformat = ‘mysql’;
–使用mysql loader
3,IB loader語法
IB僅支持load data infile,其餘的mysql導入方式不支持
LOAD DATA INFILE ‘/full_path/file_name’
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 'char']
[ENCLOSED BY 'char']
[ESCAPED BY 'char']
];
導入前關閉
set AUTOCOMMIT=0;
完成後
COMMIT;
set AUTOCOMMIT=1;
4,區域分隔符
.區域分隔符是可選的,默認設置爲
CLAUSE DEFAULT VALUE
FIELDS TERMINATED BY ‘;’ (semicolon)
FIELDS ENCLOSED BY ‘」‘ (double quote)
FIELDS ESCAPED BY 」 (none)
5,導入經驗
a. 當導入表格列數不少時,修改brighthouse.ini中LoaderMainHeapSize
b 使用併發導入
c 容忍性排序爲txt_variables<binary<mysql
d bh_loader不支持多分隔符
e 大量數據時,DLP是必要選擇
1.妥善處理字符集,在導入和遷移時,儘可能將全部%character%均改成與原庫相同的字符集W維西:Hi,作了個測試,兩邊GBK在我這邊比較正常,請看http://t.cn/akbcDH 可能仍是字符集的問題,全部的變量都要改下:)
目前infobright應用愈來愈多了,有些場景下須要和臺管理系統共用,所以須要同時存在brighthouse和myisam兩種引擎。
這時候,若是須要brighthouse引擎支持utf8字符集,須要:
1. 數據庫對象建立時務必使用utf8字符集,這點尤其關鍵,不然不可支持utf8;
2. 數據表對象建立時也使用utf8字符集;
3. 導入文件提早轉換成utf8字符集;
4. 鏈接infobright時,執行set names utf8;
5. 導入文件,查看字符集是否正確;
另外一種場景下,可能myisam表也須要支持utf8,這個相對比較麻煩:
1. 數據庫對象建立時無所謂,不強制必須是utf8;
2. 數據表對象建立時務必使用utf8字符集;
3. 將導入文件所有轉換成utf8字符集的INSERT語法,直接寫入數據,infobright不支持LOAD DATA INFILE方式導入utf8字符集的文件;
4. 也能夠將其餘非字符型字段導入後,再用update進行更新
create table t_mis( uid mediumint not null, cid smallint not null, rating tinyint not null)engine=MyISAM;
create table t_ib( uid mediumint not null, cis smallint not null, rating tinyint not null)engine=brighthouse;
load data infile 'F:\\mytable.csv' into table t_ib fields terminated by ',' optionally enclosed by '"' lines terminated by '\n';
注意:
擁有file權限才能夠執行 select ..into outfile和load data infile…操做,可是不要把file, process, super權限授予管理員之外的帳號,這樣存在嚴重的安全隱患。
mysql> grant file on *.* to tet@localhost;
mysql> load data infile ‘/home/mysql/test.txt’ into table test;