MySQL数据库是支持正则表达式的,主要解决过滤特别复杂的查询场景,在实际工作中,使用的场景不多,大部分场景like可以解决。
这里主要说说like和regexp之间的差别
举个例子:
例如pad列的值为:
30742328470-63631046568-21137316667-11884173392-16264131183
pad like '30742328470’这种写法,是查询不到记录的,除非使用pad like ‘30742328470%’,匹配整列的值。
而如果用regexp,可以这样写,pad regexp ‘30742328470’,不用匹配整列值,就可以过滤出需要的记录行。
还是举一个实际案例来说明一下。
过滤t_sbtest2中,前缀为30742328470的记录,分别来看看SQL的执行计划。
使用like的执行计划
[root@localhost] 17:09:20 [t_db]>explAIn select * from t_sbtest2 where pad like '30742328470%';
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
| 1 | SIMPLE | t_sbtest2 | NULL | range | idx_pad | idx_pad | 180 | NULL | 1 | 100.00 | Using index condition |
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)
使用regexp的执行计划
[root@localhost] 17:10:13 [t_db]>explain select * from t_sbtest2 where pad regexp '30742328470';
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | t_sbtest2 | NULL | ALL | NULL | NULL | NULL | NULL | 2946 | 100.00 | Using where |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
从上面可以看出,like语句是走了idx_pad索引,而regexp没有走索引,如果生产上有使用regexp的需求,则需要注意语句的性能,尤其是做更新和删除的时候,会导致锁表。