Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql模糊查询结果取反

mysql模糊查询结果取反问题

作者:qq_35327536

这篇文章主要介绍了mysql模糊查询结果取反问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

mysql模糊查询结果取反

问题描述

1、表结构:

 

2、只要包含3这种类型的都不能查询。 

解决方式

1、模糊查询出所有包含3这种类型的数据,在使用not in这种方式:

SELECT * FROM system_account WHERE id NOT IN (SELECT id FROM system_account WHERE identity_type LIKE "%3%");

这种方式如果类型中有13、23这种带3的类型就需要修改模糊条件。

2、使用正则匹配方式:

SELECT * FROM `system_account` WHERE identity_type REGEXP "^([1,2,4,5,6,7,8,9]{1}\,?)*[1,2,4,5,6,7,8,9]{1}$";

这种方式只要在这种中排除3这种类型就可以了,但是没添加一种类型就需要修改一次sql语句。

同事问的这个问题,第一反应是模糊查询取反,所以感觉很有意思就记录一下。

最终这种方案也没有用上,同事把需求弄反了。

模糊查询可以使用 not like 这种查询方式 平时从来没有用过也没看见过 所以没想到这种方法

SELECT * FROM admin_produce_order WHERE product_code LIKE 'CP211%' AND po_come_factory NOT LIKE "%罗西%"

mysql模糊匹配后匹配优化

线上存在业务代码,需要模糊匹配且进行后匹配

select * from test where id like "%1231"

优化过程

mysql的后模糊匹配是不走索引的,所以数量级增大后,sql执行速度会越来越慢,但是业务一定要保留该功能,且频繁调用;

处理方案:

1. 使用表中已存在的其他列索引

如果查询的表存在其他列索引,可以直接使用模糊匹配查询完整的主键信息,再进行业务查询

select id from test where id like "%1231"
select * from test where id = #{id}

该方案简单迅速,查询索引级别一般可以达到index

2. 使用缓存记录模糊匹配列所有数据

先进行缓存记录所有模糊列数据,再经过缓存进行数据匹配,最后进行业务查询。

该方案需要保证缓存可靠,并且及时更新

3. 数据库增加相反列,并设置对应索引

例如,原模糊列为id,值为123,相反列起名id_reverse,值则为321

当进行模糊匹配时,先对传入参数进行却反,123取反为321,最后用相反列进行匹配

select * from test where id_reverse like "321%"

如果需要保证该条件同时满足前匹配和后匹配

select * from test where id like "123%" or id_reverse like "321%"

该方案需要保证相反列和模糊列数据保持相反,并同步更新,索引级别可达range

type索引类型:

ststem > const > eq_ref > ref > range > index > all

优化级别从左往右递减,没有索引的一般为’all’,需要对type进行优化前提是有索引。

其中’system’和’const’只是理想型,实际只能达到’ref’和’range’。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文