通用算法-sql相似度模糊匹配
1、需求描述:數(shù)據(jù)庫采集sql語句的記錄表,包含記錄編號-ID、日期時間-data、sql語句-statement,對表內(nèi)每一條記錄的sql語句和表內(nèi)其他記錄的sql語句進(jìn)行模糊匹配,以順序字符匹配方式進(jìn)行,達(dá)到定義的相似度,就為該相似度統(tǒng)計(jì)值加1,目的是統(tǒng)計(jì)和該sql語句類似語句的執(zhí)行頻率;表內(nèi)每新增一條記錄就要和表內(nèi)原保存所有記錄進(jìn)行sql模糊匹配,并為表內(nèi)原保存記錄的相應(yīng)相似度等級增加統(tǒng)計(jì)值,比如原來表內(nèi)有100萬內(nèi),現(xiàn)在新增一條,則要和100萬進(jìn)行匹配;相似度等級定義:100%完全相似、99%-90%較高相似、89%-80%基本相似、79%-70%接近相似;原記錄sql語句和匹配的記錄sql語句達(dá)到所定義相似度就增加統(tǒng)計(jì)值,其中各級別不累加,比如達(dá)到較高相似,基本相似和接近相似不增加統(tǒng)計(jì)值。
?
2、sql表設(shè)計(jì)字段如下:
????? ID?????date????????????????????????????????statement?????????????????????????????????? 100%degree?????90%degree????80%degree?????70%degree
???????1???????2013-4-22 10:10:10??????? select * from A?? where B=C?????????20????????????????????50??????????????????30???????????????????80
?????? 2???????2013-4-22 10:11:10???????delete * from? A? where ??B=C???????6??????????????????????3????????????????????10????????????????????2????
?
3、通用算法:
????? 1)每新增一條記錄N,與1...N-1條記錄內(nèi)statement的sql語句進(jìn)行順序匹配,比如和記錄1進(jìn)行匹配,statement進(jìn)行字符順序匹配,達(dá)到100%相似就在100%degree加1,為21,如果是在99%-90%區(qū)間相似度,則為 90%degree加1為51,類似,如果低于70%,則沒有任何相似不統(tǒng)計(jì);
????? 2)算法復(fù)雜度:假如sql表內(nèi)有100萬條記錄,每增加1條,要進(jìn)行100萬次sql語句匹配,為每一條記錄統(tǒng)計(jì)四個等級的相似度,那么算法復(fù)雜度就是線性階O(n)-100萬條匹配下去統(tǒng)計(jì)每一條記錄的相似度;同時每次匹配內(nèi)都要進(jìn)行兩個sql語句的字符串匹配,其算法復(fù)雜度為O(n*m)-兩個sql語句字符長度大小的每個字符比較,如果第一個字符都不相同,那么就可以馬上放棄匹配,如果完全相同,則達(dá)到平方階O(n2);整體算法復(fù)雜度將是立方階O(n3)。假設(shè)已有100萬,每分高峰新增1萬條,sql語句平均字符長度為20,那么算法復(fù)雜度就是每分鐘要完成100萬*1萬*20*20的執(zhí)行時長,在實(shí)時情況下性能要求較高。
?
4、字符串匹配的改進(jìn)算法:
???? 在通用算法基礎(chǔ)上改進(jìn)sql語句字符匹配算法,在匹配串中尋找模式串是否出現(xiàn)及出現(xiàn)多少字符(相似度=相同字符/匹配串字符長度),通用算法是將匹配串和模式串左對齊,然后從左向右一個一個進(jìn)行比較,如果不成功則模式串向右移動一個單位。改進(jìn)上可以采用的字符串匹配算法有:KMP算法、Horspool算法、Boyer-Moore算法、Sunday算法、RK算法,一般串匹配方法,是將模式串的一個一個字符作為小的特征去分別進(jìn)行匹配,而RK算法則是將串整體作為一個特征。
?
5、提高算法空間復(fù)雜度的改進(jìn)算法:
?????? sql表設(shè)計(jì)字段改進(jìn),增加每條記錄每個相似度等級的相關(guān)記錄,比如ID=2的記錄,90%degree有3條記錄,那么我記錄下這三條記錄的ID號,一旦新增的記錄ID=N和ID=2滿足90%相似度,那么自然繼承了ID=2與這3條記錄的90%相似度,就可以對這三記錄(關(guān)聯(lián)了這三條記錄的ID)的90%degree分別加1,即ID=2和ID=n以及這三條記錄的90%degree值都是4。這種繼承屬性就減少了匹配條數(shù),不需要進(jìn)行100萬次匹配了,不如在第20萬條滿足了,那么后面80萬條就不用匹配了。
?
6、改進(jìn)算法方向:顯然算法還不夠合理,需要進(jìn)一步優(yōu)化,方向在于犧牲空間降低時間,比如多表支撐百萬記錄匹配,而串匹配算法不斷改進(jìn)也是重要的。也可以考慮引進(jìn)數(shù)據(jù)挖掘來支撐該統(tǒng)計(jì)分析需求。如果實(shí)時無法達(dá)到需求,可以采用非高峰期定時執(zhí)行匹配。
總結(jié)
以上是生活随笔為你收集整理的通用算法-sql相似度模糊匹配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试Web数据分析工具HttpWat
- 下一篇: (转载)微信公众平台 - 实例(未验证)