<返回更多

MySQL数据库like和regexp

2022-06-21    月牙讲数据库运维
加入收藏

MySQL数据库是支持正则表达式的,主要解决过滤特别复杂的查询场景,在实际工作中,使用的场景不多,大部分场景like可以解决。

这里主要说说like和regexp之间的差别

  1. like是匹配整列值,regexp是匹配子字符串
  2. like部分场景可以走索引,而regexp则不会走索引

like是匹配整列值,regexp是匹配子字符串

举个例子:
例如pad列的值为:
30742328470-63631046568-21137316667-11884173392-16264131183
pad like '30742328470’这种写法,是查询不到记录的,除非使用pad like ‘30742328470%’,匹配整列的值。

而如果用regexp,可以这样写,pad regexp ‘30742328470’,不用匹配整列值,就可以过滤出需要的记录行。

like部分场景可以走索引,而regexp则不会走索引

还是举一个实际案例来说明一下。
过滤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的需求,则需要注意语句的性能,尤其是做更新和删除的时候,会导致锁表。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>