mysql 中 in/exists/not in/not exists/or的使用场景和效率对比

阅读更多


mysql 中 in/exists/not in/not exists/or的使用场景和效率对比
  请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
网上一堆博客在讨论mysql里面内置的关键字的效率问题,绝大部分都脱离了一定的前提条件就展开了论述,这是不科学的。
首先我们必须确定在mysql的哪个版本当中来讨论。这一点是因为mysql是在不断的快速更新当中的,大家都知道5.6的版本和之前的版本之间质的飞跃可以说是
里程碑式的。当然硬件环境也要保持一致。存储引擎也必须一致。该使用索引的地方使用索引,联合索引用的适当效率会很高,覆盖索引。

以下都是以InnoDB作为存储引擎做比较的。

讨论in VS or
在当前版本中(5.6.x),
   1 数据量较小的情况下,效率相差无几。
   2 数据量较大的时候,in 效率平稳降低,or 急剧降低。
     请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
讨论in VS exists
in 与exists的本质: in 是两张变的hash连接,exists是外层变loop循环,每次循环操作内层表。
在当前版本中(5.6.x),
   1 当数据量较小的时候,使用任何一种效率都不受影响。
   2 当数据量较大的时候 分为两种情况
     1) 子查询的结果集较小,这时候使用in的效率比较好
2) 子查询的结果集较大,这时候使用exists效率好。
     3)能用between的地方就不要用in
讨论not in VS not exists
在当前版本中(5.6.x),
  not exists 的效率始终比not in 要好。
  可以用distinct就不要用group by
    请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
  注意mysql的版本,可能等下一个大版本更新的时候,一切都可能会改变。
 
  分页的时候 尽量如此优化
  select * from page where id between 1000000 and 1000010;

 

你可能感兴趣的:(in,exists,or,not,exists,效率)