• 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
  • 相关阅读:
    TikTok的AI技术:智能推荐的幕后机制
    centos7 arm服务器编译安装onnxruntime-gpu
    Vue前端模板框架--vue-admin-template
    2005.6-2018.6月中国企业OFDI微观数据
    【详解+安装失败解决】Win11系统装CH340驱动方法
    【Kaggle项目实战记录】一个图片分类项目的步骤和思路分享——以树叶分类为例(用Pytorch)
    Vue3+elementplus搭建通用管理系统实例九:通用表格实现下
    牛客练习赛101
    java 网络编程 总结篇
    form表单基础
  • 原文地址:https://blog.csdn.net/Huangjiazhen711/article/details/127405152