论坛首页 综合技术论坛

insert into select和regexp

浏览 2129 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-29  
最近有这么一个需求,对mysql一张很大的表的一个text类型的字段用若干个规则进行匹配,规则由复杂的与或表达式组成,例如:(A and B)or(C and D and E),这里有两个实现版本。
第一:取出此text类型字段作为content,拿content和规则中的关键字进行正则匹配,得到一个新的表达式,类似于(0 and 1) or ( 1 and 0 and 1)的临时表达式,然后使用Antlr构造AST对临时表达式求值,得到最终结果,true或者false。
第二:使用mysql的关键字regexp,取出此text类型字段作为content,生成sql语句,类似于select id from table where( ( (content regexp A) and (content regexp A) ) or ( (content regexp C) and (content regexp D) and (content regexp E) ) )。
因为要将张表满足规则的记录插入到另外一张表,所以用到了mysql的insert into select,结果一个杯具发生了,死锁了。。
insert into select的原意是复制整张表,但是这里进行了复杂的正则验证,加入了业务逻辑,导致这张表的读锁,而在读的同时还会有另外一个程序向这张表写数据,就必须等待,此时恰好又采用多线程读这张表,又要再进行读,此时锁就产生了。
现在的思路:从这张很大的表中取出小范围的数据,少量多批次处理,直接取出的数据不进行匹配后放到临时表再对临时表做正则匹配,不使用insert into select,而将数据持久化到文件,再导入到临时表,或者将少量数据读取存放到内存中,在内存中使用AST进行匹配。

现在的问题:两者的结果是否相同?AST在大数据量处理能否正常运行,现在是小数据多批次,但还是需要测试?另外如何防止内存泄露?如果采用临时表和文件,mysql的建表和 load data infile效率如何?都需要测试,明天开始测试。。

希望有经验的高手们拍砖。
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics