天天看點

Infobright 小結

Infobright的基本特征:

  優點:

  查詢性能高:百萬、千萬、億級記錄數條件下,同等的SELECT查詢語句,速度比MyISAM、InnoDB等普通的MySQL存儲引擎快5~60倍

  存儲資料量大:TB級資料大小,幾十億條記錄

  高壓縮比:在我們的項目中為18:1,極大地節省了資料存儲空間

  基于列存儲:無需建索引,無需分區

  适合複雜的分析性SQL查詢:SUM, COUNT, AVG, GROUP BY

支援事務(但不支援 savepoint)

  限制:

  不支援資料更新:社群版Infobright隻能使用“LOAD DATA INFILE”的方式導入資料,不支援INSERT、UPDATE、DELETE

  不支援高并發:隻能支援10多個并發查詢;

   ICE版本不對于infobright引擎不能使用主從結構;

Infobright  和 MySQL

   Server層采用MySQL,存儲引擎層采用Infobright,由于是列式存儲引擎,Infobright 不能作為MySQL的插件存在,MySQL 也不能使用 infobright的 Knowledge Grid特性;仍可使用 MyISAM 和 CSV  MEMORY 存儲引擎;

整體架構圖:

MySQL 與 infobright 各自分工:

   MySQL: connect,tools,resources;驗證;服務管理,各種內建工具

   Infobright: load 、compress data; 列式存儲引擎, Knowledge Grid 中繼資料統計資訊;

          優化/執行

   對于ICE版本,如果想要使用Innodb 這樣的引擎的話,最後借助federated 遠端連接配接存儲引擎;

架構分析:

   Infobright通過三層來組織資料,分别是DP(Data Pack)、DPN(Data Pack Node)、KN(Knowledge Node)。而在這三層之上就是無比強大的知識網絡(Knowledge Grid)。

   資料塊(DP)是存儲的最低層,列中每64K個單元組成一個DP。DP比列更小,具有更好的壓縮比率;又比單個資料單元更大,具有更好的查詢性能。

   資料塊節點(DPN),DPN和DP之間是一對一的關系。DPN記錄着每一個DP裡面存儲和壓縮的一些統計資料,包括最大值、最小值、null的個數、單元總數count、sum等等。

   KN裡面存儲着指向DP之間或者列之間關系的一些中繼資料集合,比如值發生的範圍(MIin_Max)、列資料之間的關聯。大部分的KN資料是裝載資料的時候産生的,另外一些事是查詢的時候産生。

   Knowledge Grid構架是Infobright高性能的重要原因。

   Knowledge Grid可分為四部分,DPN、Histogram、CMAP、Pack/Pack

   Histogram用來提高數字類型(比如date,time,decimal)的查詢的性能。是裝載資料的時候就産生的;

   DPN中有mix、max,Histogram中把Min-Max分成1024段,如果Mix_Max範圍小于1024的話,每一段就是就是一個單獨的值。

   Histogram的作用就是快速判斷目前DP是否滿足查詢條件。

   CMAP是針對于文本類型的查詢,也是裝載資料的時候就産生的。用數值記錄某個字元串是否出現;0表示沒有出現,1表示出現過。查詢中文本的比較歸根究底還是按照位元組進行比較,是以根據CMAP能夠很好地提高文本查詢的性能。

   Pack-To-Pack是Join操作的時候産生的,它是表示join的兩個DP中操作的兩個列之間關系的位圖,也就是二進制表示的矩陣。

Brighthouse.ini 記憶體推薦配置:

注意:infobright  可使用bhload 導入資料;

     從infobright導出含有null的資料的時候,不會顯示,是以在導入到其他MySQL時候,會造成 column不對應;

     壓縮比率指的是資料庫中的原始資料大小/壓縮後的資料大小,而不是文本檔案的實體資料大小/壓縮後的資料大小。

查詢優化部分:

   對于字元串列的屬性 添加Comment Lookup可以減少存儲空間,提高壓縮率,采用comment lookup可以提高查詢效率。Comment Lookup實作機制很像位圖索引,實作上利用簡短的數值類型替代char字段已取得更好的查詢性能和壓縮比率;CommentLookup  一般要求資料類别的總數小于10000并且目前列的單元數量/類别數量大于10。Comment Lookup比較适合年齡,性别,省份這一類型的字段;

   盡量不适用or,可以采用in或者union取而代之;

   盡量使用獨立的子查詢和join操作代替非獨立的子查詢;

   不在where裡面使用MySQL函數和類型轉換符;

   盡量避免會使用MySQL優化器的查詢操作;

   避免使用跨越Infobright表和MySQL表的查詢操作;

   select裡面盡量剔除不要的字段。

本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/1255762,如需轉載請自行聯系原作者