通用算法-sql相似度模糊匹配

来源:互联网 发布:iphone视频特效软件 编辑:程序博客网 时间:2024/05/01 10:38

1、需求描述:数据库采集sql语句的记录表,包含记录编号-ID、日期时间-data、sql语句-statement,对表内每一条记录的sql语句和表内其他记录的sql语句进行模糊匹配,以顺序字符匹配方式进行,达到定义的相似度,就为该相似度统计值加1,目的是统计和该sql语句类似语句的执行频率;表内每新增一条记录就要和表内原保存所有记录进行sql模糊匹配,并为表内原保存记录的相应相似度等级增加统计值,比如原来表内有100万内,现在新增一条,则要和100万进行匹配;相似度等级定义:100%完全相似、99%-90%较高相似、89%-80%基本相似、79%-70%接近相似;原记录sql语句和匹配的记录sql语句达到所定义相似度就增加统计值,其中各级别不累加,比如达到较高相似,基本相似和接近相似不增加统计值。

 

2、sql表设计字段如下:

      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条记录内statement的sql语句进行顺序匹配,比如和记录1进行匹配,statement进行字符顺序匹配,达到100%相似就在100%degree加1,为21,如果是在99%-90%区间相似度,则为 90%degree加1为51,类似,如果低于70%,则没有任何相似不统计;

      2)算法复杂度:假如sql表内有100万条记录,每增加1条,要进行100万次sql语句匹配,为每一条记录统计四个等级的相似度,那么算法复杂度就是线性阶O(n)-100万条匹配下去统计每一条记录的相似度;同时每次匹配内都要进行两个sql语句的字符串匹配,其算法复杂度为O(n*m)-两个sql语句字符长度大小的每个字符比较,如果第一个字符都不相同,那么就可以马上放弃匹配,如果完全相同,则达到平方阶O(n2);整体算法复杂度将是立方阶O(n3)。假设已有100万,每分高峰新增1万条,sql语句平均字符长度为20,那么算法复杂度就是每分钟要完成100万*1万*20*20的执行时长,在实时情况下性能要求较高。

 

4、字符串匹配的改进算法:

     在通用算法基础上改进sql语句字符匹配算法,在匹配串中寻找模式串是否出现及出现多少字符(相似度=相同字符/匹配串字符长度),通用算法是将匹配串和模式串左对齐,然后从左向右一个一个进行比较,如果不成功则模式串向右移动一个单位。改进上可以采用的字符串匹配算法有:KMP算法、Horspool算法、Boyer-Moore算法、Sunday算法、RK算法,一般串匹配方法,是将模式串的一个一个字符作为小的特征去分别进行匹配,而RK算法则是将串整体作为一个特征。

 

5、提高算法空间复杂度的改进算法:

       sql表设计字段改进,增加每条记录每个相似度等级的相关记录,比如ID=2的记录,90%degree有3条记录,那么我记录下这三条记录的ID号,一旦新增的记录ID=N和ID=2满足90%相似度,那么自然继承了ID=2与这3条记录的90%相似度,就可以对这三记录(关联了这三条记录的ID)的90%degree分别加1,即ID=2和ID=n以及这三条记录的90%degree值都是4。这种继承属性就减少了匹配条数,不需要进行100万次匹配了,不如在第20万条满足了,那么后面80万条就不用匹配了。

 

6、改进算法方向:显然算法还不够合理,需要进一步优化,方向在于牺牲空间降低时间,比如多表支撑百万记录匹配,而串匹配算法不断改进也是重要的。也可以考虑引进数据挖掘来支撑该统计分析需求。如果实时无法达到需求,可以采用非高峰期定时执行匹配。

原创粉丝点击