- 論壇徽章:
- 44
|
本帖最后由 windoze 于 2013-04-25 10:22 編輯
MySQL中按子串查找(LIKE '%xxx%')的速度會很慢,一個簡單的思路是把每個序列中的每個堿基單獨建立倒排鏈并保存位置,這樣在查詢時只需要按照單個堿基做phrase query。這么做的缺點是,因為堿基只有4個,每個倒排鏈都會很長,查詢效率只能說比LIKE略高。
一個優(yōu)化一點的方案是N Gram,也就是把堿基序列切分成長度為N的片段,例如“GCTTAT”的2Gram切分就是GC,CT,TT,TA,AT,3Gram就是GCT,CTT,TTA,TAT,每個切片的位置前進(jìn)一位,你可以對序列做一個1~N的切片,也就是按照單個堿基切分一遍,按照2Gram切分一遍,按照3Gram切分一遍…………然后針對所有這些切片建立倒排鏈。
查詢時,如果要查詢的序列長度大于預(yù)先建立好的索引中最大的N,則需要將查詢序列按照最大的N做一個NGram切分,將所有的切分片段做一個AND query,在這個結(jié)果集中再做單個堿基的phrase query,或者直接查找子串,因為你的查詢序列是已知的,所以可以用KMP預(yù)先建立跳轉(zhuǎn)表,速度會比較快。
這個過程的作用是確保沒有false positive,因為NGram AND query并不能確保得到的結(jié)果集一定準(zhǔn)確。
這樣做的缺點是N越大,索引就會越大,但是N越大查詢的速度就會越快。 |
|