SELECT * FROM A WHERE id IN (SELECT id FROM B);)
等价于:
- SELECT id FROM B ----->先执行in中的查询,并且缓存结果集;
- SELECT * FROM A WHERE A.id = B.id。
适用场景
从内外表数据量的大小视角剖析,B表数据比A表数据小,B表符合要求的数据都被缓存起来,A中每查询一次就与缓存中的数据比较一次。以下用遍历结果集的方式来分析IN查询: private void search() {
List result = new ArrayList(); //结果集
String A[] = {"select * from A"}; // 存储从A表查询到的结果集
String B[] = {"select * from B"}; // 存储从B表查询到的结果集
for (String bValue : B) {
for (String aValue : A) {
if (aValue.equals(bValue)) {
result.add(aValue);
break;
}
}
}
System.out.println(result);
}
通过以上Java伪代码可以看出,当B表的数据较大时不适合使用in查询,因为它会遍历B表中的全部记录。
案例分析
1、A表中有100条记录,B表中有1000条记录,那么最多可能遍历1000*100次,效率很差; 2、A表中有1000条记录,B表中有100条记录,那么最多可遍历100*1000此,内循环次数减少,效率大大提升。小结
IN查询适合B表数据量比A表数据量小的情况,并且是从缓存中取数据。MYSQL中in的用法
标签:search pre 数据 循环 class mysql col array break