最近有这么一个需求,对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效率如何?都需要测试,明天开始测试。。
希望有经验的高手们拍砖。
分享到:
相关推荐
insert into STUDENT values(2001,'小王',13,'男'); insert into STUDENT values(2002,'明明',12,'男'); insert into STUDENT values(2003,'红红',14,'女'); insert into STUDENT values(2004,'小花',13,'女'); ...
(3)`SELECT REGEXP_INSTR(ename, 'T', 1), REGEXP_INSTR(ename, 'T', 2) FROM emp;` (4)`SELECT * FROM emp WHERE hiredate ;` (5)`SELECT * FROM emp WHERE hiredate = ADD_MONTHS(LAST_DAY(SYSDATE), -2)...
12. Select * from 表名 where 字段名 regexp(not regexp)或者 rlike(not rlike):正则表达式匹配。 编辑命令 1. use database 库名:使用的数据库。 2. create database 库名:创建数据库。 3. create table ...
insert into student(Sid,Sname,Sex,Sage,Sdept) values(1,'张三','女',20,'IT '); insert into student(Sid,Sname,Sex,Sage,Sdept) values(2,'李四','女',25,'info '); ... ``` 在上面的语句中,我们使用INSERT ...
INSERT INTO TableA VALUES ('ano1', '0755,0789,010,0112', '0731,07323'); INSERT INTO TableA VALUES ('ano2', '020,021,022', NULL); ``` 3. **拆分字段:** ```sql WITH SplitData AS ( SELECT Id, ...
首先,插入数据是通过`INSERT INTO`语句实现的。例如,如果有一个名为`employees`的表,可以使用以下语句添加新记录: ```sql INSERT INTO employees (id, name, age) VALUES (1, 'John Doe', 30); ``` 这将在`...
在SQL语言中,用于查询和操作数据库的基本语句主要包括SELECT、INSERT、UPDATE、DELETE和CREATE。以下是对这些语句的详细解释,以及如何在实际应用中使用它们。 **SELECT语句**是SQL中最常用的部分,用于从数据库中...
- 使用`INSERT INTO`语句插入数据,如`INSERT INTO table_name VALUES (value1, value2, ...);`或`INSERT INTO table_name (column1, column2) VALUES (value1, value2);` 6. **查询数据**: - SELECT语句用于...
13. **数据插入**:`INSERT INTO`用于插入新记录,如`INSERT INTO user (name, sex) VALUES ('xbd', 0)`。如果字段有自动增长属性,可以省略对应的值。 14. **更新数据**:`UPDATE`用于修改现有记录,如`UPDATE ...
- 正则表达式匹配:`SELECT * FROM Websites WHERE name REGEXP '^[A-H]'`选取以A到H开头的网站。 - `IN`运算符:`SELECT * FROM websites WHERE name IN ('Google', '菜鸟驿站')`。 - `BETWEEN`和`NOT BETWEEN`...
17. 向数据表中插入记录使用 `INSERT INTO table_name (column1, column2,...) VALUES (value1, value2,...);` 18. `REGEXP` 是正则表达式过滤数据的关键字,如 `WHERE column REGEXP pattern;` 19. 数据操纵语句...
- `select * from 表名 where 字段名 regexp (not regexp) 或者 rlike (not rlike) "正则表达式"`:使用正则表达式进行更复杂的匹配。 此外,还有编辑数据库对象的命令: 1. 使用数据库:`use database 库名`,...
- 使用INSERT INTO语句的VALUES子句或SELECT子句将数据插入到表中。 以上知识点总结了MySQL数据库程序设计的基础和高级特性,涉及了SQL语句的编写、数据操作、表的维护、索引和视图的管理,以及全文搜索和存储引擎...
61、select ename, sal from emp join (select max(sal) max_sal ,deptno from emp group by deptno) t on (emp.sal = t.max_sal and emp.deptno=t.deptno); --查询每个部门中工资最高的那个人 -----------------...
17. 插入记录使用 `INSERT INTO table_name (column1, column2,...) VALUES (value1, value2,...);` 18. 正则表达式过滤数据的关键字是 `REGEXP`,如`WHERE column REGEXP pattern;` 19. `SELECT` 语句是最常用的SQL...
INSERT INTO Employees (EmployeeID, FirstName, LastName, Department, Email) VALUES (1, 'John', 'Doe', 'Sales', 'john.doe@example.com'); ``` 更新记录则用UPDATE语句: ```sql UPDATE Employees SET Email ...
4. `Grant`:用于赋予用户特定的数据库权限,如`SELECT`, `INSERT`, `UPDATE`, `DELETE`等,可以指定用户能访问的数据库和表,并设置其登录主机和密码。 5. `mysqldump`:这是一个用于备份数据库的工具,`--u root -...
- **DML(Data Manipulation Language)**:用于处理数据库中的数据,如插入、更新、删除记录,例如 `INSERT INTO`、`UPDATE`、`DELETE FROM`。 - **DCL(Data Control Language)**:用于控制数据库的访问权限,...
- MySQL 支持使用正则表达式进行模式匹配,例如 `LIKE` 和 `REGEXP`。 #### 高级查询 - **多表连接查询** - 内连接:`SELECT * FROM table1 INNER JOIN table2 ON condition;` - 左外连接:`SELECT * FROM table...