1.首先比较exists和in
exists 适合内表大,外表小
in 适合内表小,外表大
例如 有查询 select * from table1 where table1.id in/exists (select table1ID from table2 where table2.id>10)
table1 就是外表 ,后边子查询结果集就是内表 ,暂时定义为son
in的过程就是;
for(int i=0,i<table1.length,i++)
{
for(int j=0,j<son.length,j++)
{
if(table1.id==son.table1ID)
{
count ++
}
}
}
exists过程就是:
for(int j=0,j<son.length,j++)
{
for(int i=0,i<table1.length,i++)
{
if(table1.id==son.table1ID)
{
count ++
}
}
}
所以就有了上边的结论
2.not exist 和 not in
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快