insert into select和regexp

最近有这么一个需求,对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效率如何?都需要测试,明天开始测试。。

希望有经验的高手们拍砖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值