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进行批量处理,具体怎么用根据业务场景灵活使用。