in 的执行过程:
MySQL先将子查询结果存入临时表T(可能在内存中,也可能磁盘中),确保子查询只执行一次,该表不记录重
复数据且采用哈希索引遍历数据,然后通过T表的数据去遍历外表,通过关联关系得到外表的需要的数据,in查
询相当于多个or条件的叠加
exists 的执行过程:
exists对外表A用loop逐条查询,每次查询都会去验证exists的条件语句(也就是exists后面括号里面的语
句),当 exists里的条件语句能够返回记录行时(只要能返回结果即可,不管你查询的是什么内容!!!),
条件就为真,就会返回当前loop到的A的这条记录,反之如果exists里的条件语句不能返回记录行,条件为
假,则当前loop到的A的这条记录被丢弃,子查询执行的次数和外表条数有关
在许多数据库语言中in和or的实现是一致的,没有效率的区别。但在mysql中,in会先对列表排序(先将in的元
素a1, a2, ..., an变成二叉树,通过二叉树查找,时间复杂度O(log n)),or 就是从a1匹配,匹配失败,去
匹配a2,直到匹配成功或者一个都匹配不上,时间复杂度O(n),因此in效率更高(在有索引的情况下in和or效
率基本相同)
默认情况下MySQL会对所有GROUP BY co1,col2 …的字段进行排序,我们可以对其使用ORDER BY NULL禁止排
序,避免排序消耗资源