关于优化mysql in关键字查询慢的问题 由于业务场景限制这里没有使用EXISTS关键字

                       in和exitst都慢了怎么办?这里有方案三

exists和in的使用方式简单总结:

#对B查询涉及id,使用索引,故B表效率高,可用大表 -->外小内大

select * from A where exists (select * from B where A.id=B.id);

#对A查询涉及id,使用索引,故A表效率高,可用大表 -->外大内小

select * from A where A.id in (select id from B);

详细用法请自行百度

 

不巧的是被我遇到了这种 in(这里是3000以上长度的数组),导致查询在1.5秒以上,业务场景限制了exists的使用

SELECT * FROM A WHERE FIND_IN_SET( a.id,'3000以上长度的数组必须是字符串类型')>0

 

解析:

FIND_IN_SET是MySQL的内置函数,个人感觉跟Java的contains包含、是否存在比较相似所以根据经验我把MySQL in做的事情转化为字符串中是否存在或包含另一个字符串,这样一来数据的检索被转换成了字符串中匹配有无的逻辑,效率上高出的是一个量级,至于这种做法后续会不会遇到更大的坑暂时没有发现也没有想到。

 

<-- 以下是没有表达清除的废话 -->

思路拓展:

这种思路是将复杂对象简单化后处理比较问题,同样适合Java、js等语言,如多重for循环判断相等的问题,其实就是将复杂的数据拆分映射比较再找到匹配的原数据,有时也需要将更复杂的数据结构导入到表中使用sql进行批量处理,具体怎么用根据业务场景灵活使用。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值