SQL笛卡尔积查询与关联查询性能对比

首先声明一下,sql会用略懂,不是专家,以下内容均为工作经验,聊以抒情。

今天帮忙验证同事发布的端口时,查看了一下相关sql内容,发现其使用的sql语句会导致笛卡尔积现象,为了帮其讲解进行了如下分析:

student表:

teacher表:

course表:

student_course表:

与发现问题类似的SQL1查询语句:

SELECT
    d.st_name,d.class_id,d.st_id
FROM
    course    AS a,
    student_course AS b,
    teacher AS c,
    student AS d
WHERE
    a.cu_id = b.cu_id
    AND b.st_id = d.st_id
    AND c.dep_id = d.dep_id
    AND a.cu_name = ‘英语‘;

采用内关联的SQL2语句:

SELECT
    student.st_name,
    student.class_id,
    student.st_id
FROM
    course
    JOIN student_course USING ( cu_id )
    JOIN student USING ( st_id )
    JOIN teacher USING ( dep_id )
WHERE
course.cu_name = ‘英语‘;

执行时间对比(已经多次验证):

SELECT
    d.st_name,d.class_id,d.st_id
FROM
    course    AS a,
    student_course AS b,
    teacher AS c,
    student AS d
WHERE
    a.cu_id = b.cu_id
    AND b.st_id = d.st_id
    AND c.dep_id = d.dep_id
    AND a.cu_name = ‘英语‘
> OK
> 时间: 0.002s

SELECT
    student.st_name,
    student.class_id,
    student.st_id
FROM
    course
    JOIN student_course USING ( cu_id )
    JOIN student USING ( st_id )
    JOIN teacher USING ( dep_id )
WHERE
course.cu_name = ‘英语‘
> OK
> 时间: 0.001s

分析原因:

在不加course.cu_name = ‘英语‘这条约束条件时,我们对比一下查询结果内容,如下所示SQL1查询结果:

SQL2查询结果:

可以看出SQL1结果的字段多于SQL2,当数据量很大或相关表字段更多时,通过where的条件查询会在性能上有明显的区别,因此建议sql编写时注意相关方法的使用以提升性能。

只是个小实验,详细解释可参考该贴:https://www.cnblogs.com/alianbog/p/5618349.html

盗图一枚,敬请见谅。

原文地址:https://www.cnblogs.com/Bug-Hunter/p/9531509.html

时间: 2024-10-04 21:29:18

SQL笛卡尔积查询与关联查询性能对比的相关文章

Mongoose如何实现统计查询、关联查询

[问题]Mongoose如何实现统计查询.关联查询 发布于 4 年前  作者 a272121742  13025 次浏览 最近业务上提出一个需求,要求能做统计,我们设计的文档集,统计可能跨越的文档会比较多,想问一下,mongoose能实现统计查询和关联查询吗? 例如student文档对象有subject文档对象,subject文档对象有score属,查询所有学员的成绩.我个人的思路就是一般的解决方案,先查询所有学员,再查询所有分数,然后遍历做累加统计 StudentDao.find().sele

高级查询,关联查询

高级查询 1.关联查询作用:可以跨越多表查询 --查询出员工的名字和他所在部门的的名字//错误select first_name,name from s_emp,s_dept;//错误的原因:产生笛卡尔积(在查询两张表的时候,一张表中的数据与另一张表中的数据一一匹配),产生了冗余数据. //古老的写法:select first_name,name from s_emp,s_dept where s_emp.deop_id = s_dept.id; //现在的写法:select e.first_n

子查询与关联查询哪个效果高

子查询: select a.*,(select workflowname from workflowbase where id=workflowid) workflownamefrom  [[zping.com]]] awhere a.operator='402882ed1112669201112a8385892f33' 执行结果: (360 行受影响)表 'Worktable'.扫描计数 360,逻辑读取 142334 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理

Oracle 高级查询1 关联查询 分组查询

高级查询 1.关联查询作用:可以跨越多表查询 --查询出员工的名字和他所在部门的的名字 语法:select 列,列,列 from 表1 join 表2on 表1外键=表2主键 2.外联接 左外联[left outer join] 以关联的左边为准,即使右边没有与之匹配的记录,则左边的记录也要 出现在结果集中,右边全部以NULL值显示. 右外联[right outer join] 以关联的右边为准,即使左边没有与之匹配的记录,则右边的记录也要 出现在结果集中,左边全部以NULL值显示. 3分组查询

子查询与关联查询区别

1.子查询1.1. MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作1.2.子查询虽然很灵活,但是执行效率并不高1.3.执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程2.连接查询(join)2.1.可以使用连接查询(JOIN)代替子查询,连接查询不需要建立临时表,因此其速度比子查询快总结:连接查询效率高于子查询!!!扩展:

Mybatis高级查询之关联查询

3 关联查询 做查询之前,先修改几个配置.mapper.xml是在mybatis-config.xml中指定,那么我们每增加一个mapper都要增加一个配置,很麻烦.为了简化配置.需要将mapper接口和mapper.xml放到同一个文件下,并且接口和xml文件命名一致.使用mybatis的自动扫描:.这样,当我们新增接口的时候,直接创建接口和对应xml文件就可以了: <mappers> <!--<mapper resource="com.test.mapper.dao/

sql语句 两表关联查询计算数量

select sum(a1.`num`)   from `order_orderlistrow` as a1 INNER JOIN `order_orderlist` as a2 on a1.`order_orderlist_id`  = a2.`id`  where a1.`goods_good_id` ='54' and a2.`state` <> '0' 原文地址:https://www.cnblogs.com/daochong/p/10281478.html

Mysql - 查询之关联查询

? 查询这块是重中之重, 关系到系统反应时间. 项目做到后期, 都是要做性能测试和性能优化的, 优化的时候, 数据库这块是一个大头. sql格式: select 列名/* from 表名 where 条件 group by 列 having 条件 order by 列 asc/desc; 这里牵涉到一个查询执行顺序的问题. 单表查询执行顺序: select sex, count(Sex) as count from tch_teacher where id > 15 group by Sex h

(一)SQL关联查询的使用技巧 (各种 join)

---恢复内容开始--- (一)SQL关联查询的使用技巧 (各种 join) 这几天因为工作的时候,发现自己的sql语句基础不是很好,特意研究了一下,发现sql语句真的是博大精深,sql语句不仅是要查出来你想要的数据,更讲究查询的效率,因为在查询大量数据时往往会因为数据量大,造成效率很低,再加上前后台数据的交互,造成了访问延迟等等的一系列问题. 在我们的日常工作中往往用到很多的查询方式,例如 嵌套查询,关联查询,子查询等等,就我而言,我感觉关联查询是最容易学习,和效率最高的.下面就我总结的关联查