曾经一次去面试,被问及in与exists的区别,记得当时是这么回答的:''in后面接子查询或者(xx,xx,xx,,,),exists后面需要一个true或者false的结果",当然这么说也不算错,但别人想听的是sql优化相关,肯定是效率的问题,只是那个时候确实不知道它们在sql优化上的区别,只知道用in会进行全表查询,exists不会全表查询,然后,我就灰溜溜的回来了!
今天就来彻底搞清楚它们的区别,查询了众多网上资料如下:
转: Mysql中 in or exists not exists not in区别 (网络整理)
总结起来大概是这样的:
in是先进行子查询,然后将内表(子查询)与外表(主查询)进行hash关联(笛卡尔积),然后进行条件比较,即筛选in前后字段相等的数据保留,不相等的删除.
exists是先进行外层表loop循环,然后将每一条数据当做条件进行子查询,如果子查询返回true则保存该数据,否则删除.
可以理解为用in时先子表全表查询,然后将每一条数据作为条件以及索引拿去进行主表查询,所以如果主表大于子表,那么用in就会效率高,
而用exists会先进行主表全表查询,然后将每一条数据作为条件以及索引拿去进行子表查询,,所以如果主表小于子表,那么用exists会效率高.
因为索引在数据多的时候才真正派上用场了.
not in主表和子表都不会用到索引且子表有null值时,查询结果有问题,
而not exists子表始终会用到索引,而且不会存在子表有null值时的问题
转: [笔记] SQL性能优化 - 避免使用 IN 和 NOT IN
所以,用not exists替代not in