MySQL查询where条件加FIND_IN_SET查询过慢

1、查询的SQL

需求很简单,就是从视图表dept_point_view查出一些数据,数据量也就500多条,但是查询会好事7秒多

select
        ID as ID,
        deptId as deptId,
        DEPT_CODE as deptCode,
        DEPT_NAME as deptName,
        SHORT_NAME as shortName,
        DEPT_ADDRESS as deptAddress,
        SCORE_CONTENT as scoreContent,
        SCORE_NUM as scoreNum,
        (CASE
        WHEN STATUS='1' THEN '已提交'    
        WHEN STATUS='2' THEN '已审核'
        WHEN STATUS='4' THEN '已驳回'
        ELSE '' END) as  status 
        from dept_point_view        
WHERE FIND_IN_SET(DEPT_ID,getChildLst(#{t.deptId,jdbcType=VARCHAR}))
AND `STATUS`!=0 and `STATUS`!=3 
ORDER BY DEPT_ID limit 0,10

2、问题

开始以为是其他查询条件问题,在我设置的getChildLst(),纠结了好久,才逐步意识到有可能是FIND_IN_SET出现的问题,最后多亏了这位博主:https://blog.csdn.net/wokelv/article/details/78915502

问题得以解决

select
        ID as ID,
        deptId as deptId,
        DEPT_CODE as deptCode,
        DEPT_NAME as deptName,
        SHORT_NAME as shortName,
        DEPT_ADDRESS as deptAddress,
        SCORE_CONTENT as scoreContent,
        SCORE_NUM as scoreNum,
        (CASE
        WHEN STATUS='1' THEN '已提交'    
        WHEN STATUS='2' THEN '已审核'
        WHEN STATUS='4' THEN '已驳回'
        ELSE '' END) as  status 
        from dept_point_view       
,(SELECT getChildLst('6c20df3a7294480cab85e7caacfdb869') cids) t WHERE FIND_IN_SET(deptId,cids)
  AND `STATUS`!=0 and `STATUS`!=3 
  ORDER BY DEPT_ID limit 0,10

先把函数返回来的缓存

<h3>回答1:</h3><br/>find_in_set函数是MySQL中的一个字符串函数,用于在一个逗号分隔的字符串列表中查找一个指定的字符串,并返回其在列表中的位置。例如,find_in_set('a', 'a,b,c,d')将返回1,因为字符串'a'在列表中的第一个位置。 在实际应用中,find_in_set函数通常用于查询某个字段中是否包含指定的值。例如,可以使用以下语句查询包含'apple'的记录: SELECT * FROM fruits WHERE find_in_set('apple', fruits_list) > ; 其中,fruits_list是一个逗号分隔的字符串列表,包含了所有水果的名称。如果某个记录的fruits_list字段中包含了'apple',则该记录将被返回。 需要注意的是,find_in_set函数只能用于逗号分隔的字符串列表,如果列表中使用了其他分隔符,该函数将无法正常工作。 <h3>回答2:</h3><br/>find_in_setmysql中的一种字符串处理函数,用于在指定的字符串中查找指定值是否存在,并返回其在字符串中的位置。该函数可以用于将逗号分隔的字符串的值与另一个值进行比较。其语法如下: find_in_set(str,strlist) 其中,str是要搜索的字符串,strlist是要搜索的逗号分隔的字符串。 比如说,如果我们有一个students表,其中有一个名为hobby的字段,其中记录着每个学生的兴趣爱好,多个兴趣爱好之间用逗号隔开,我们希望查询所有喜欢篮球的学生,可以使用如下的sql语句: select * from students where find_in_set('篮球', hobby) > 0; 该语句会返回所有喜欢篮球的学生的记录。如果使用其他的比较符号,比如=、<、>等,可能会出现查询不正确的情况。 需要注意的是,find_in_set函数的性能比较差,因为要对逗号分隔的字符串进行分割,而且只能进行全文搜索。如果有更好的查询条件,建议使用其他的查询方式进行检索。 <h3>回答3:</h3><br/>MySQL中的find_in_set函数就是用于在指定字段中查找一组值中的某一个值是否存在。在MySQL中,find_in_set的语法如下: find_in_set('要查找的值','要查询的字段') 其中,要查询的字段必须是逗号分隔的多个值,可以是字符串或数字。 find_in_set函数的返回值是布尔值,如果查找到指定值则返回1,否则返回0。因此,在使用find_in_set函数时,最好将查询结果用IF语句进行判断和排序。 在实际开发中,find_in_set函数通常用于查询带有单选框或多选框的表单数据。例如,假设有一个存储用户兴趣爱好的表格user表,包含两个字段:user_id和interests,而interests字段是一个逗号分隔的字符串,存储用户选择的兴趣爱好。如下: user_id | interests ------- | --------- 1 | 音乐,电影,篮球 2 | 篮球,足球,游戏 3 | 游泳,阅读,旅游 如果想查询所有选择了篮球这个兴趣爱好的用户,则可以使用如下SQL语句: SELECT user_id FROM user WHERE FIND_IN_SET('篮球',interests) > 0; 该SQL语句会返回user_id为1和2的用户,因为他们都选择了篮球作为兴趣爱好。 总结:find_in_set函数是MySQL中非常实用的一个查询函数,可以用于查询带有单选框或多选框的表单数据。需要注意的是,在使用find_in_set函数时,要确保指定的字段是以逗号分隔的多个值,否则查询结果可能会出现错误。同时,在查询结果中需要使用IF语句进行判断和排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值