MySQL数据库是支持正则表达式的,主要解决过滤特别复杂的查询场景,在实际工作中,使用的场景不多,大部分场景like可以解决 。
这里主要说说like和regexp之间的差别
- 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的需求,则需要注意语句的性能,尤其是做更新和删除的时候,会导致锁表 。推荐阅读
- MySQL5.X数据库安装
- 搭建开源美观的数据库监控系统-Lepu
- web大规模的生产环境构建的开源图形数据库-Dgraph
- MySQL分页导致的线上事故分析
- MySQL 数据库设计规范
- lnmp一键安装包使用Navicat远程访问mysql8
- moves like jagger moves like jagger 歌词
- 数据库|盘点下这些年来改变自己的一些重要时机
- MySQL 的 EXPLAIN 语句及用法
- 国产开源的跨平台数据库建模工具——PDManer