MySQL数据库like和regexp

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的执行计划
【MySQL数据库like和regexp】[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的需求,则需要注意语句的性能,尤其是做更新和删除的时候,会导致锁表 。




    推荐阅读