Infobright數(shù)據(jù)庫(kù)查詢優(yōu)化
前面已經(jīng)分析了Infobright的構(gòu)架,簡(jiǎn)要介紹了Infobright的壓縮過程和工作原理。現(xiàn)在來討論查詢優(yōu)化的問題。
(1)配置環(huán)境
在Linux下面,Infobright環(huán)境的配置可以根據(jù)README里的要求,配置brighthouse.ini文件。
(2) 選取高效的數(shù)據(jù)類型
參見《細(xì)數(shù)Infobright的相關(guān)數(shù)據(jù)類型》。
(3)使用comment lookup
comment lookup只能顯式地使用在char或者varchar上面。Comment Lookup可以減少存儲(chǔ)空間,提高壓縮率,對(duì)char和varchar字段采用comment lookup可以提高查詢效率。
Comment Lookup實(shí)現(xiàn)機(jī)制很像位圖索引,實(shí)現(xiàn)上利用簡(jiǎn)短的數(shù)值類型替代char字段已取得更好的查詢性能和壓縮比率。CommentLookup的使用除了對(duì)數(shù)據(jù)類型有要求,對(duì)數(shù)據(jù)也有一定的要求。一般要求數(shù)據(jù)類別的總數(shù)小于10000并且當(dāng)前列的單元數(shù)量/類別數(shù)量大于10。Comment Lookup比較適合年齡,性別,省份這一類型的字段。
comment lookup使用很簡(jiǎn)單,在創(chuàng)建數(shù)據(jù)庫(kù)表的時(shí)候如下定義即可:
act char(15) comment 'lookup',
part char(4) comment 'lookup',
(4)盡量有序地導(dǎo)入數(shù)據(jù)
前面分析過Infobright的構(gòu)架,每一列分成n個(gè)DP,每個(gè)DPN列面存儲(chǔ)著DP的一些統(tǒng)計(jì)信息。有序地導(dǎo)入數(shù)據(jù)能夠使不同的DP的DPN內(nèi)的數(shù)據(jù)差異化更明顯。比如按時(shí)間date順序?qū)霐?shù)據(jù),那么前一個(gè)DP的max(date)<=下一個(gè)DP的min(date),查詢的時(shí)候就能夠減少可疑DP,提高查詢性能。換句話說,有序地導(dǎo)入數(shù)據(jù)就是使DP內(nèi)部數(shù)據(jù)更加集中,而不再那么分散。
(5)使用高效的查詢語句。
這里涉及的內(nèi)容比較多了,總結(jié)如下:
盡量不適用or,可以采用in或者union取而代之
減少IO操作,原因是infobright里面數(shù)據(jù)是壓縮的,解壓縮的過程要消耗很多的時(shí)間。
查詢的時(shí)候盡量條件選擇差異化更明顯的語句
Select中盡量使用where中出現(xiàn)的字段。原因是Infobright按照列處理的,每一列都是單獨(dú)處理的。所以避免使用where中未出現(xiàn)的字段可以得到較好的性能。
限制在結(jié)果中的表的數(shù)量,也就是限制select中出現(xiàn)表的數(shù)量。
盡量使用獨(dú)立的子查詢和join操作代替非獨(dú)立的子查詢
盡量不在where里面使用MySQL函數(shù)和類型轉(zhuǎn)換符
盡量避免會(huì)使用MySQL優(yōu)化器的查詢操作
使用跨越Infobright表和MySQL表的查詢操作
盡量不在group by 里或者子查詢里面使用數(shù)學(xué)操作,如sum(a*b)。
select里面盡量剔除不要的字段。
Infobright執(zhí)行查詢語句的時(shí)候,大部分的時(shí)間都是花在優(yōu)化階段。Infobright優(yōu)化器雖然已經(jīng)很強(qiáng)大,但是編寫查詢語句的時(shí)候很多的細(xì)節(jié)問題還是需要程序員注意?!?/p>
原文鏈接:http://blog.chinaunix.net/u2/72637/showart_2306114.html
【編輯推薦】