開發(fā)android22人的查找和優(yōu)化_第1頁
開發(fā)android22人的查找和優(yōu)化_第2頁
開發(fā)android22人的查找和優(yōu)化_第3頁
開發(fā)android22人的查找和優(yōu)化_第4頁
開發(fā)android22人的查找和優(yōu)化_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

聯(lián)系人的查找和SQL一,聯(lián)系人的部分表結(jié)構(gòu)與查

-----簡單的說,聯(lián)系人的數(shù)據(jù)不是單一的在某一個表中。在android中,增加了賬號以。,表data了聯(lián)系人(每個聯(lián)系人其實是個賬戶)的20多項數(shù)據(jù),比如,號碼,類型和號碼(零個或多個)在同一列中,由類型(共有9種類型:郵件, 。,表raw_contacts了聯(lián)系人的賬號名稱,賬戶類型,顯示的名字,排序關(guān)鍵字等20data.raw_contact_idraw_contacts._id關(guān)聯(lián)起來。在表的創(chuàng)建語句CREATETABLEdata****,raw_contact_idINTEGERREFERENCESNOTNULL,表name_lookup了查找聯(lián)系人的一些匹配信息。它包括4data_id:data表的_idraw_contacts_id:raw_contacts表的_idnormalized_name:二,name_lookup表的1android中有一個特殊的類:HanziToPinyin。顧名思義,他能將一串漢字(比如:張三)以及漢字與字母、數(shù)字、特殊字符(比如:ab*#)轉(zhuǎn)換成拼音(非漢字的字符保持不publicstaticclassTokenpublicstaticfinalStringSEPARATOR="publicstaticfinalintLATIN=1;publicstaticfinalintPINYIN=2;publicstaticfinalintUNKNOWN=3;publicToken(){}publicToken(inttype,Stringsource,Stringtarget){this.type=type;this.source=source;this.target=target;}publicinttype;publicStringsource;publicStringtarget;}publicArrayList<Token>get(finalStringinput)字,保存在一個ArrayList中。 2ArrayListlist1。list1Token的數(shù)據(jù)是:typeToken.PINYINsource=張target=list1Token的數(shù)據(jù)是:type=Token.PINYINsource=target=又如get(“ab*#”),這個將會返回具有6個元素的ArrayList,list2list21256個Token的數(shù)據(jù)是:type=Token.LATINsource=a b, *, target=a b, *, 也就是對于這些數(shù)字,字母,特殊符號就返回其本身。)list234個Tokenlist1的數(shù)據(jù)一致。2,接下來是要將解析后的數(shù)據(jù)存入表name_lookup中了(我們修改后的數(shù)據(jù))對于一個名字“李四”,解析后是“zhangsanlisi”si、lsi、slsi、zslsi:用于拼音的首拼查找,注意會最后一個字的全拼lisi,sanlisi,zhangsanlisi數(shù)字 65474:用于數(shù)字的全拼查找name_lookupandroid2.2Table如下語句(SQLLEFTOUTERJOIN ON(_id=presence_contact_id)LEFTOUTERJOIN ASON(status_update_id=contacts_status_updates.status_update_data_id)contact_idASsnippet_contact_id,data._idASsnippet_data_id,data1ASsnippet_data1,data2ASsnippet_data2,data3ASsnippet_data3,data4AS(SELECTmimetypeFROMmimetypesWHERE_id=mimetype_id)ASdataJOINraw_contactsON (data.raw_contact_id=raw_contacts._id)data._idIN(SELECTFROMname_lookupJOINraw_contactsON(raw_contacts._id=name_lookup.raw_contact_id)WHEREnormalized_nameGLOB'297E *'ANDname_typeIN(2,4,3,6,5,7)GROUPBY))ON,其中view_contacts_restricted也是是一個非常復(fù)雜的視圖。agg_presence是在內(nèi)存中的一個關(guān)于聚合的表。normalized_nameGLOB'297E *'中的'297E LE1000個10+的。二、聯(lián)系人查找的優(yōu)化:從10多秒到幾十SQLselectx,x,x,x,fromdata,raw_contacts,name_lookupwhere這個語句雖然非常簡單,但是它會執(zhí)行一次3個表的乘積,非常耗時。raw_contacts.contact_idAS_id,raw_contacts.sort_key_altASsort_key_alt,_data.data1as on(raw_contacts._id _data.mimetype_id=(selectdistinctraw_contact_idas wherenormalized_nameGLOB'2982*'name_type)(raw_contacts._id= andraw_contacts.deleted<>1經(jīng)過優(yōu)化這個查詢語句只需要4S左右的時間了,但是不能滿足我們的raw_contacts.contact_idAS_id,raw_contacts.sort_key_altASsort_key_alt,_data.data1as(selectdistinctraw_contact_idas wherenormalized_nameGLOB'2982*'name_type)(raw_contacts._id= andraw_contacts.deleted<>1 on(raw_contacts._id _data.mimetype_id=這下時間又減少了一點。不過還有優(yōu)化的空間,注意到這個語句,name_typeIN(2,4,3,6,5,7) 這個語句其實很糟糕,應(yīng)該把IN轉(zhuǎn)換成對應(yīng)的OR,但是我們又發(fā)現(xiàn)里面的數(shù)字的規(guī)律性可以將其寫為更高效的name_type>=2andraw_contactsdata20多列的數(shù)據(jù),查詢時,數(shù)據(jù)處理需

raw_contacts.contact_idAS_id,_data.data1asselectdistinctraw_contact_idas wherenormalized_nameGLOB'2982*'AND(name_type>=2andname_type<=7))join(select_id,dis fromwhereraw_contacts.deleted<>1) (raw_contacts._id=name_lookup_idjoin raw_contact_id,data1fromdatawheredata.mimetype_id=on(raw_contacts._id _data.raw_contact_id)行數(shù)較小的放面做運算。經(jīng)過這樣的優(yōu)化,查詢的所需的時間僅為800MS了.,。3,800MS的查詢,在使用的時候感覺有點遲鈍需要優(yōu)化,從頭到(index,。name_lookup的查詢列:normalized_name個列上會有比較多的重復(fù)的數(shù)據(jù),可惜的是不支持聚簇索引這個特性androidname_lookup(1)CREATEINDEXname_lookup_raw_contact_id_indexONname_lookup(2)CREATEINDEXname_lookup_indexONname_lookup(normalized_name,name_type,raw_contact_id,data_id);1)db.execSQL("DROPINDEXIFEXISTSname_lookup_index");INSERTORIGNOREINTOname_lookup(data_idraw_contact_id,normalized_name,name_type)1350毫秒!這個已經(jīng)非??炝?。對于一個組合索引如果一個T語句的WERE句中了組合索引的全部列或列開始且連續(xù)的部分列將有助于提高此查詢的性能因此索引定義中列的順是很重要的。大體上說,經(jīng)常的列或選擇性較大的列應(yīng)該放面。同上面介紹的名字方法一樣,存入name_lookup表中。但是這樣做會在表余。對于這個功能,我們只需要修改上面的查詢語句即可。phone_lookup2列:raw_contact_id,以及normalized_number(反序后的,使用SQL的UNION關(guān)鍵字,將SQL語句改為:raw_contacts.contact_idAS_id,_data.data1as distinct as wherenormalized_nameGLOB'2982*'AND(name_type>=2and distinctraw_contact_idasname_lookup_idfromphone_looku

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論