注意:本文参考  查询优化之嵌套查询 - 知乎

嵌套查询简单来说就是有子查询的SQL语句,子查询可以出现在SLECT, FROM或者WHERE 子句中,也可以单独用WITH子句来定义一个子查询。使用时子查询可以将一个复杂的查询拆分成一个个独立的部分,逻辑上更易于理解以及代码的维护和重复使用。有利于程序查询缓存,减少锁的竞争,减少查询冗余,应用层面相当于实现哈希关联。更容易对数据库进行拆分,做到高可用,易拓展,解耦。但是子查询另一个很明显的问题就是效率比较低,比如创建临时表和查询时重复扫表。所以我们可以根据不同的嵌套查询类型进行查询优化。

嵌套查询的几种主要类型

1.类型A:子查询返回的值是一个聚集函数的结果,并且与外查询独立,即子查询不使用外查询表中的字段。例如

SELECT *
FROM exam e
WHERE e.grade = (SELECT max(grade) FROM exams)

这里查询执行时先遍历exam表,过程中exam表的每个元组都要再遍历得出最高的分数,即重复遍历表和计算。

由于子查询没有用到外查询的表exam, 所以可以单独估算子查询的开销,即看作一个常数。

所以可以直接定义该子查询为一个常量,如下:

DEFINE m = (SELECT max(grade) FROM exams)
SELECT *
FROM exam e
WHERE e.grade = m

2.类型N:子查询不包含与外查询的任何连接操作,并且没有聚集函数。例如:

SELECT *
FROM exam e
WHERE e.department IN (SELECT f.id FROM department f WHERE f.name="computer science")

这种类型的优化可以通过使用连接操作,如下:

SELECT *
FROM exam e,department f
WHERE e.department = f.id AND f.name="computer science")

3.类型J:子查询依赖于外部查询的表,但是子查询没有聚集函数。如下:

SELECT OrderNr
FROM Orders O
WHERE ProdNr IN (SELECT ProdNrFROM Shipping SWHERE S.ShipNr = O.OrderNrAND S.Date= current date)

对于Orders表中的每个元组来说,都要检索一次Shipping表,效率非常低下。可以转换成连接操作:

SELECT OrderNr
FROM Orders O,Shipping S
WHERE O.ProdNr = S.ProdNrAND S.ShipNr = O.OrderNrAND S.Date= current date

4.依赖连接dependent join

对于普通的连接操作,其公式为

而在嵌套查询中,还会出现依赖连接,即右表要先从左表中生成或引用左表,再与左表连接,公式为:

假设查询每个公司的最贵的产品,并返回产品和公司名:

SELECT DISTINCT c.cname, px.pname
FROM company c, product px
WHERE c.cid = px.cid
and px.price = (SELECT max(p.price)
FROM product p
WHERE c.cid=p.cid);

生成的查询计划如下

这里对product使用了聚集函数后又再与两个表连接再使用聚集函数,是一种nest loop join,进行了大量重复计算。所以可以直接将子查询放到From语句中,与另外两个表直接连接,这样查询计划会都使用更加高效的hash join的方式生成连接表再聚集。

mysql 嵌套查询优化相关推荐

  1. 【MySQL】查询优化

    [MySQL]查询优化 1. 优化目的与目标 1.1 为什么要进行查询优化 1.1 MySQL优化目标 2. 优化流程及思路 2.1 调优时你需要关注哪些指标 2.1 合理监控 2.3 MySQL优化 ...

  2. mysql嵌套子查询索引_SQL 子查询,索引优化

    场景 索引优化 单列索引 多列索引 索引覆盖 排序 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 create table Course( c_id int PRIMARY KE ...

  3. mysql 存储过程查询优化_mysql用存储过程插入百万条数据, 及查询优化

    查看所有存储过程: show procedure status; 查看详细存储过程 ptest: show create procedure ptest; 存储过程插入数据: create table ...

  4. mysql所有班级名称和人数_mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...

    mysql数据库优化课程---12.mysql嵌套和链接查询(查询user表中存在的所有班级的信息?) 一.总结 一句话总结: in:distinct:select * from class wher ...

  5. psql where里有自定义函数慢_阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结...

    MySQL优化概述 MySQL数据库常见的两个瓶颈是:CPU和I/O的瓶颈. CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候. 磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应 ...

  6. MySQL 慢查询优化

    为什么查询速度会慢 1.慢是指一个查询的响应时间长.一个查询的过程: 客户端发送一条查询给服务器 服务器端先检查查询缓存,如果命中了缓存,则立可返回存储在缓存中的结果.否则进入下一个阶段 服务器端进行 ...

  7. php 嵌套 mysql_PHP中实现MySQL嵌套事务的两种解决方案,mysql嵌套_PHP教程

    PHP中实现MySQL嵌套事务的两种解决方案,mysql嵌套 一.问题起源 在MySQL的官方文档中有明确的说明不支持嵌套事务: 1. Transactions cannot be nested. T ...

  8. mysql数据库查询优化建议_mysql数据库查询优化的24条建议

    MySQL是一个强大的开源数据库.随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈.这里提供一些关于Mysql 数据库查询优化的24条优化建议,仅供参考. Mysql 查询优化 1.使用慢查询 ...

  9. php mysql查询例子_php mysql一个查询优化的简单例子

    PHP+Mysql是一个最经常使用的黄金搭档,它们俩配合使用,能够发挥出最佳性能,当然,如果配合Apache使用,就更加Perfect了. 因此,需要做好对mysql的查询优化,下面通过一个简单的例子 ...

  10. mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...

    mysql数据库优化课程---12.mysql嵌套和链接查询(查询user表中存在的所有班级的信息?) 一.总结 一句话总结: in:distinct:select * from class wher ...

最新文章

  1. Mybatis LIKE模糊查询
  2. 设计模式:里氏替换原则
  3. bzoj 3196/tyvj p1730 二逼平衡树
  4. 01.神经网络和深度学习 W2.神经网络基础(作业:逻辑回归 图片识别)
  5. web通讯录之搜索功能
  6. CodeForces 551E(平方分割
  7. MINT:蛋白质相互作用数据库简介
  8. HDU 5857 Median
  9. word 自己写的发给他人显示批注 并且字体颜色也有变化
  10. java按钮添加图片_java 如何插入含有图片的按钮
  11. 疫情数据分析平台(五):中国疫情地图绘制
  12. WPS文字 JSA 学习笔记 - 批量设置表格
  13. linux多重引导工具,不同操作环境下,如何制作多重引导USB?
  14. 那些散落在风中的密码
  15. python编程要懂英语吗_初中毕业没有英语基础能学编程吗?该学C还是Python?
  16. 2020年T电梯修理考试及T电梯修理考试总结
  17. Android修行手册-TextView不常用属性篇
  18. elk告警 elastalert安装 钉钉消息(一)
  19. 高地创新“至臻和鸣”体系甄选客户答谢会暨公益论坛隆重举行
  20. 几种DOS下实用的MP3播放器的介绍http://lason.bokee.com/5967848.html

热门文章

  1. STM32驱动AD9833模块
  2. 【项目实战——emos在线办公系统】:会议申请、请假申请等部分代码理解
  3. QQ小程序开发之 一些前期准备:预约开发账号、下载安装开发者工具、创建qq小程序
  4. django清空数据库
  5. 使用git进行word版本管理
  6. Ubuntu安装无线网卡驱动
  7. 远比5G发展凶猛!物联网2018白皮书,国内规模已达1.2万亿
  8. 电力-101/104规约基础2
  9. 华为 U2000 技术研究开始
  10. usb抓包工具 安卓_USB抓包工具(Bus Hound)下载 v6.0.1 官方版