• MySQL执行计划EXPLAIN


    EXPLAIN 执行计划

    我们先创建三张表。一张课程表,一张老师表,一张老师联系方式表(没有任何索引)。

    DROP TABLE IF EXISTS course;
    
    CREATE TABLE `course` (
    
    `cid` int(3) DEFAULT NULL,
    
    `cname` varchar(20) DEFAULT NULL,
    
    `tid` int(3) DEFAULT NULL
    
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    DROP TABLE IF EXISTS teacher;
    
    CREATE TABLE `teacher` (
    
    `tid` int(3) DEFAULT NULL,
    
    `tname` varchar(20) DEFAULT NULL,
    
    `tcid` int(3) DEFAULT NULL
    
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    DROP TABLE IF EXISTS teacher_contact;
    
    CREATE TABLE `teacher_contact` (
    
    `tcid` int(3) DEFAULT NULL,
    
    `phone` varchar(200) DEFAULT NULL
    
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    INSERT INTO `course` VALUES ('1', 'mysql', '1');
    
    INSERT INTO `course` VALUES ('2', 'jvm', '1');
    
    INSERT INTO `course` VALUES ('3', 'juc', '2');
    
    INSERT INTO `course` VALUES ('4', 'spring', '3');
    
    INSERT INTO `teacher` VALUES ('1', 'qingshan', '1');
    
    INSERT INTO `teacher` VALUES ('2', 'jack', '2');
    
    INSERT INTO `teacher` VALUES ('3', 'mic', '3');
    
    INSERT INTO `teacher_contact` VALUES ('1', '13688888888');
    
    INSERT INTO `teacher_contact` VALUES ('2', '18166669999');
    
    INSERT INTO `teacher_contact` VALUES ('3', '17722225555');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    id

    id 是查询序列编号,每张表都是单独访问的,一个 SELECT 就会有一个序号。

    id 值不同的时候,先查询 id 值大的(先大后小)。

    -- 查询 mysql 课程的老师手机号
    
    EXPLAIN SELECT tc.phone
    
    FROM teacher_contact tc
    
    WHERE tcid = (
    
        SELECT tcid
    
        FROM teacher t
    
        WHERE t.tid = (
    
        SELECT c.tid
    
        FROM course c
    
        WHERE c.cname = 'mysql'
        )
    
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    查询顺序:course c——teacher t——teacher_contact tc。

    先查课程表,再查老师表,最后查老师联系方式表。子查询只能以这种方式进行,只有拿到内层的结果之后才能进行外层的查询。

    id 值相同(从上往下)

    -- 查询课程 ID 为 2,或者联系表 ID 为 3 的老师 
    EXPLAIN
    SELECT t.tname, c.cname, tc.phone
    FROM teacher t,
         course c,
         teacher_contact tc
    WHERE t.t
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    Electron自动化测试技术选型调研
    设置Google浏览器在点击网站时,在新页面打开
    小侃设计模式(八)-装饰者模式
    Windows 10 的资源管理器频繁出现未响应的几种解决办法
    redis实现缓存集合不需要查询数据库了
    Matlab使用cftool进行曲线拟合
    .NET程序的 GDI句柄泄露 的再反思
    [paddle]paddlepaddle官方安装命令合集
    HashMap 这套八股,不得背个十来遍?
    JavaEE之HTTP协议 Ⅰ
  • 原文地址:https://blog.csdn.net/Huangjiazhen711/article/details/127405152