In 查询及其优化

 

in 和 exist关键字

In

  1. 在8.0版本中,mysql优化器会去计算走索引要扫描的行数和时间(如果要回表,则还要计算回表的效率)与走全表扫描的时间,从而选择。
  2. 为了防止发生死锁和重复,mysql优化器选择排序条件后的范围查询。
  3. 所以,in条件少,(扫描的row少),一般走索引,条件多,则不走索引。但是如果使用到了联合索引,发生覆盖索引查询,一般都会比全表扫描的时间要短。(同理,使用主键索引不用回表一般也会使用主键索引)
  4. in条件只有一个会转化成条件查询 =,使用到了索引。其次可能用到的是range, index(索引的全表扫描),all。

结论:in一般会走索引,但是当范围过大,回表次数过多,索引会失效(二级索引)。但是如果查询符合覆盖索引或者查询条件为主键索引(不回表效率肯定高)的,那么,一定会用到索引。

子查询

执行顺序不同,in先执行子查询,exists先执行父查询。

子查询优化

大多数的(in)子查询可以优化为join。当in数据量大的时候,子查询会产生临时表,导致索引失效,查询性能降低。

注意:优化的SQL有一定的局限性,是所有的子查询都可以用join优化,如存在union, group by, order by, limit 等一般不用join,当SQL较为简单才可以优化。

加强子查询优化理解的网址链接:https://www.bilibili.com/video/BV16H4y127kC/?spm_id_from=444.41.list.card_archive.click&vd_source=75bb2f53d007e412f0a191bb12a6e62c

posted @ 2023-11-25 12:08  奋斗成为牛马  阅读(222)  评论(0编辑  收藏  举报