本文主要向大家介绍了MySQL数据库之嵌套查询与连接查询的性能详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。

嵌套查询与连接查询的性能:连接查询一般较快;子查询很难被优化。(当然和DB优化有关,也可能子查询比连接查询快)其实不能一概而论的~~ 不过,问了下DBA同学,他建议是能用join的,尽量不要用嵌套查询。以下内容,部分是来自网上的一些观点,自己稍加整理的。

子查询是实现关联式计算的一种实例,连接实现了关联式代数。关于关联式计算(relational calculus)和关联式代数(relational algebra),貌似比较数学或者理论性的东西理论,我也还没深入弄明白。

很多人也说到,这个性能的比较,不能一概而论的,需要具体的每个Case具体分析。

也有人说(并有在某种DBMS上用一个例子证明),子查询可以也可能被优化为与join一样的执行计划,性能可以一样的。

说一下概念吧:在一个SELECT语句的WHERE子句或HAVING子句中嵌套另一个SELECT语句的查询称为嵌套查询,又称子查询。一个select...From...Where查询语句块可以嵌套在另一个select...From...Where查询块的Where子句中,称为嵌套查询。外层查询称为父查询,主查询。内层查询称为子查询,从查询。子查询可以嵌套多层,子查询查询到的结果又成为父查询的条件。子查询中不能有order by分组语句。先处理子查询,再处理父查询。 子查询除非能确保内层select只返回一个行的值,否则应在外层where子句中用一个in限定符,即要返回多个值,要用in或者not in哦,所以当在编译过程中出现“子查询只返回一个值”的错误时,就要考虑是不是要用in和not in.

可以自己用写个PL/SQL写一段来看执行时间的差异,不过由于dbms的优化,我执行了几次,结果都不每次效率一致,因为查询后可能在dbms端由缓存、优化之类的:declare time1 timestamp(3); time2 timestamp(3); cou number; begin select current_timestamp into time1 from dual; select count(p.id) into cou from product p where p.company_id in (select c.id from company c); --select count(p.id) into cou from product p inner join company c on p.company_id=c.id; select current_timestamp into time2 from dual; dbms_output.put_line(time1); dbms_output.put_line(time2); dbms_output.put_line(time2-time1); dbms_output.put_line(cou); end;

关于连接查询,以前总结过一下:https://www.51testing.com/index.php?uid-225738-action-viewspace-itemid-210222

下面是我所查到的网页中的一些摘录:

Joining should always be faster - theoretically and realistically. Subqueries- particularly correlated - can be very difficult to optimise. If you think

about it you will see why - technically, the subquery could be executed oncefor each row of the outer query.

Subqueries such as that described are one instance of the way that SQL implements relational calculus (you will see that it is basically an "Exists" type of

operation). Joins are an implementation of relational algebra. The optimisation of relational algebraic operations is *very* well understood, while the calculus is much more difficult to optimise...

Realistically, most good DBMSs will optimise a query such as yours to use a join instead, thus converting the implementation from calculus to algebra.

In general, subqueries - particularly correlated - should be avoided unless absolutely necessary. It makes the query harder to read/maintain, pushes more work onto the server, and is generally just a far less appropriate style. of SQL.

subquery is faster when we have to retrieve data from large number of tables.Because it becomes tedious to join more tables. join is faster to retrieve data from database when we have less number of tables

In general there is no reason to assume that a subquery will be faster or slower than a join. Specific cases can point one way or the other, but there are too many variables for a general answer. There are cases where a subquery should be faster - an EXISTS test against a JOIN, where the EXISTS stops at the first match but the JOIN has to deal with every match.

Note that in many cases the optimizer rewrites queries with correlated subqueries as outer joins, so in many cases the performance is the same.

本文由职坐标整理并发布,希望对同学们学习MySQL有所帮助,更多内容请关注职坐标数据库MySQL数据库频道!

mysql 嵌套查询性能_MySQL数据库之嵌套查询与连接查询的性能详解相关推荐

  1. mysql relay bin 主库_MySQL主库binlog(master-log)与从库relay-log关系代码详解

    主库binlog: # at 2420 #170809 17:16:20 server id 1882073306 end_log_pos 2451 CRC32 0x58f2db87 Xid = 32 ...

  2. mysql 保证事物完整性_数据库高并发请求,如何保证数据完整性?详解MySQL/InnoDB的加锁...

    本文是对MySQL/InnoDB中,乐观锁.悲观锁.共享锁.排它锁.行锁.表锁.死锁概念的理解,这些在面试中也经常遇到,如数据库高并发请求,如何保证数据完整性?今天我查阅资料进行了MySQL/Inno ...

  3. mysql游标 原理解说_mysql存储过程之游标(DECLARE)原理与用法详解

    本文实例讲述了mysql存储过程之游标(DECLARE)原理与用法.分享给大家供大家参考,具体如下: 我们在处理存储过程中的结果集时,可以使用游标,因为游标允许我们迭代查询返回的一组行,并相应地处理每 ...

  4. 新版mysql的下载教程_Mysql最新版8.0.21下载安装配置教程详解

    一.下载 1.下载安装包 mysql下载路径:https://dev.mysql.com/downloads/file/?id=496745 2.解压压缩包 解压到安装的目录: 3.在此目录下新建my ...

  5. mysql插入语句例句_MySQL 插入/添加数据语句(INSERT INTO)用法详解

    MySQL 插入数据操作使用 INSERT INTO 语句,它属于 DML(数据操作语言)范畴,该语句插入方式支持从简单的添加操作到唯一键(唯一索引)冲突时的更新操作,同时也支持查询结果直接插入操作. ...

  6. mysql外键名_MySQL外键(foreign key)使用及说明详解

    外键也称之为外键约束: foreign key 外键: 外面的键, 一张表的一个字段(非主键)指向另外一个表的主键, 那么该字段就称之为外键. 外键所在的表称之为子表(附表); 外键所指向的主键所在的 ...

  7. mysql 说明外码_MySQL外键(foreign key)使用及说明详解

    外键也称之为外键约束: foreign key 外键: 外面的键, 一张表的一个字段(非主键)指向另外一个表的主键, 那么该字段就称之为外键. 外键所在的表称之为子表(附表); 外键所指向的主键所在的 ...

  8. 小白 MySQL数据库链接查询语句_MySQL数据库——连接查询

    今天将用 "手" 来教大家关于MySQL连接查询的知识! ============================================================= ...

  9. 数据库系统原理与应用教程(066)—— MySQL 练习题:操作题 71-81(十):连接查询

    数据库系统原理与应用教程(066)-- MySQL 练习题:操作题 71-81(十):连接查询 71.连接查询(1) 数据表:Customers,包含顾客名称:cust_name.顾客 id:cust ...

最新文章

  1. 海南岛渔民捞出“鱼雷”,竟是他国间谍机器人
  2. 底部菜单 点击突起_iOS开发之上下文交互菜单(UIContextMenuInteraction)
  3. js/jq进行日期格式化为:yyyy-MM-dd 如2017-05-08
  4. cdp备份mysql数据库_数据库如何备份与恢复
  5. Arrays.copyOfRange
  6. VBA连接MySQL数据库以及ODBC的配置(ODBC版本和MySQL版本如果不匹配会出现驱动和应用程序的错误)...
  7. jQuery图片弹出Lightbox插件带轮播
  8. Presto 即席查询
  9. 2018成都大数据公司名单总汇!
  10. STM32—建立工程模板
  11. oracle 如何删除库,Oracle删除库
  12. 腾讯互娱旗下工作室一览
  13. ASP完美优化(不断更新)
  14. Openlayers 快速上手教程
  15. Github上的开源工具帮助你实现“十一”回家的愿望
  16. 【苦练基本功】代码整洁之道 pt4(第10章-第12章)
  17. 吴恩达 - 第五周 - 笔记
  18. 【工业机器人】工业机器人最全面基础知识科普,一篇文章彻底搞透
  19. c语言换行编辑,C语言怎么换行
  20. ShareSDK的使用

热门文章

  1. (艾迪茉莉转圈圈~~找最小环)Circular Sequence UVA - 1584
  2. 新华社科普漫画刷屏:一分钟看懂区块链
  3. Python学习 Day37 jQuery框架01
  4. SQL21天自学通pdf 百度云盘
  5. 吉尔布雷斯的动作研究——《可以量化…
  6. 中台干货!百度/小米/滴滴/京东,中台架构实践大比拼!
  7. 计算机硬件耗电,耗电大户不一定就“费电”_主板评测-中关村在线
  8. [Vijos1763]Wormhole (贪心/模拟?)
  9. 【天光学术】古代文学论文该怎么写?为你步步解说!
  10. java丐帮_java多线程学习笔记(五)