Infobright數據庫查詢優化
前面已經分析了Infobright的構架,簡要介紹了Infobright的壓縮過程和工作原理。現在來討論查詢優化的問題。
(1)配置環境
在Linux下面,Infobright環境的配置可以根據README里的要求,配置brighthouse.ini文件。
(2) 選取高效的數據類型
參見《細數Infobright的相關數據類型》。
(3)使用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',
(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優化器雖然已經很強大,但是編寫查詢語句的時候很多的細節問題還是需要程序員注意。
原文鏈接:http://blog.chinaunix.net/u2/72637/showart_2306114.html
【編輯推薦】