MySQL

57-MySQL索引优化与查询优化-子查询

2022-11-02  本文已影响0人  紫荆秋雪_文

一、概念

MySQL从4.1版本开始支持子查询,使用子查询可以进行SELECT语句的嵌套查询,即一个SELECT查询的结
果作为另一个SELECT语句的条件。 子查询可以一次性完成很多逻辑上需要多个步骤才能完成的SQL操作

1.1、子查询

子查询是 MySQL 的一项重要的功能,可以帮助我们通过一个 SQL 语句实现比较复杂的查询。但是,子查询的执行效率不高

1.2、子查询效率不高

1.3、解决子查询

在MySQL中,可以使用连接(JOIN)查询来替代子查询。连接查询 不需要建立临时表 ,其 速度比子查询 要快 ,如果查询中使用索引的话,性能就会更好

二、实战

2.1、创建班级表中班长的索引

CREATE INDEX idx_monitor ON class (monitor);

2.2、查询班长的信息

EXPLAIN
SELECT *
FROM student stu1
WHERE stu1.`stuno` IN (SELECT monitor
                       FROM class c
                       WHERE monitor IS NOT NULL);
DESC
SELECT *
FROM student stu
JOIN class cls ON stu.stuno = cls.monitor
WHERE cls.monitor IS NOT NULL ;

2.3、查询不为班长的同学

EXPLAIN
SELECT SQL_NO_CACHE a.*
FROM student a
WHERE a.stuno NOT IN (SELECT monitor
                      FROM class b
                      WHERE monitor IS NOT NULL);
DESC
SELECT SQL_NO_CACHE *
FROM student stu
         LEFT JOIN class cls
                   ON stu.stuno = cls.monitor
WHERE cls.monitor IS NULL;

2.4、小结

尽量不要使用NOT IN 或者 NOT EXISTS,用LEFT JOIN xxx ON xx WHERE xx IS NULL替代

上一篇 下一篇

猜你喜欢

热点阅读