首先声明一下,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

盗图一枚,敬请见谅。

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

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

    [问题]Mongoose如何实现统计查询.关联查询  发布于 4 年前  作者 a272121742  13025 次浏览 最近业务上提出一个需求,要求能做统计,我们设计的文档集,统计可能跨越的文档会 ...

  2. MySQL查询(关联查询)

    一.mysql查询与权限 (一)数据库关联查询 **内连接查询(inner join)** 查询两个表共有的数据,交集 SELECT * FROM tb1 INNER JOIN tb2 ON 条件 所 ...

  3. Oracle SQL——varchar2() 和 char()关联查询 存在空格

    背景 表dbcontinfo 字段loanid,类型为varchar2(60) 表dbloanbal 字段loanid,类型为char(60) loanid字段实际长度为24位 问题 两张表dbloa ...

  4. Mybatis高级查询之关联查询

    learn from:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps 关联查询 准备 关联结果查询(一对一) resul ...

  5. mysql系列九、mysql语句执行过程及运行原理(分组查询和关联查询原理)

    一.背景介绍 了解一个sql语句的执行过程,了解一部分都做了什么,更有利于对sql进行优化,因为你知道它的每一个连接.where.分组.子查询是怎么运行的,都干了什么,才会知道怎么写是不合理的. 大致 ...

  6. day95:flask:SQLAlchemy数据库查询进阶&关联查询

    目录 1.数据库查询-进阶 1.常用的SQLAlchemy查询过滤器 2.常用的SQLAlchemy查询结果的方法 3.filter 4.order_by 5.count 6.limit&of ...

  7. 11 MySQL_分组查询和关联查询

    分组查询 group by 将某个字段的相同值分为一组,对其他字段的数据进行聚合函数的统计,称为分组查询 单字段分组查询 1.查询每个部门的平均工资 select dept_id,avg(sal) f ...

  8. Mysql子查询、关联查询

    mysql中update.delete.install尽量不要使用子查询 一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组).orde ...

  9. 【sql】关联查询+表自关联查询

    表: 经销商 dealer   字段 uid  parent_uid  name 联系人 contact  字段 uid  dealer_id  contact_main 需求: 想要查询到经销商的信 ...

随机推荐

  1. Pycharm问题:module 'pip' has no attribute 'main'

    更新pip之后(pip 10 版本之后),Pycharm安装package出现报错:module 'pip' has no attribute 'main' 解决办法如下: 找到Pycharm安装目录 ...

  2. windows 安装docker报错:Error checking TLS connection: ssh command error: command : ip addr show

    今天安装docker部署的时候总是再报这个错误. 报错的原因是初始化的时候出错了. 在docker 安装目录下有一个文件,如下图所示 将它复制到你电脑用户名目录下生成.docker 的文件夹中,如下图 ...

  3. linux常用基础命令(一)

    Rz命令 rz命令本地上传文件到服务器: rz在弹出的框中选择文件,上传文件 sz命令 sz命令发送文件到本地: Sz文件名 例:将文件file1 Sz file1 Tomcat启动/关闭命令 比如t ...

  4. Linux中Too many open files

    1.ulimit –a open files一项就是默认的句柄数,最大为 65536 2.修改最大open files /etc/security/limits.conf文件中,加入以下配置: * s ...

  5. [转]PostgreSQL数据类型

    第六章  数据类型 6.1概述 PostgreSQL 提供了丰富的数据类型.用户可以使用 CREATE TYPE 命令在数据库中创建新的数据类型.PostgreSQL 的数据类型被分为四种,分别是基本 ...

  6. Java 基本语法,标识符,修饰符,关键字

    基本语法 编写 Java 程序时,应注意以下几点: 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的. 类名:对于所有的类来说,类名的首字母应该大写.如果类 ...

  7. APP测试点注意事项汇总

    1.异常测试:包括业务流程的异常情况:业务场景的异常:操作习惯的异常(比如答题过程中会出现声音干扰这样很不友好喔~) 2.网络测试:网络切换的过程中,APP会不会异常:断网情况进行一些操作,APP会不 ...

  8. Redis的n种妙用,分布式锁,分布式唯一id,消息队列,抽奖……

    介绍 redis是键值对的数据库,常用的五种数据类型为字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset) Redis用作缓存,主要两个 ...

  9. Python 实现auto linlink 连连看

    先上知乎上大神所写: 你看过/写过哪些有意思的代码? 然后别急着看blog,玩一把游戏再说! 看知乎评论,有人说他用了一个下午时间就写出来了. wo kao!!! 我断断续续写了一周的下午才搞定,然后 ...

  10. .NET英文技术文章导读(2017-03-23)

    关键字:VS2017.扩展.Service Fabric.Unit Test.ELMAH Web开发人员必装的5个VS2017扩展 作者:Jeffrey T. Fritz 链接:https://blo ...