MySQL子查询--

发布时间:2017-3-28 10:43:58编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"MySQL子查询--",主要涉及到MySQL子查询--方面的内容,对于MySQL子查询--感兴趣的同学可以参考一下。

参考:http://dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html

一 引子
在上述参考中,有这样的话:

The MySQL query optimizer has different strategies available to evaluate subqueries. For IN (or =ANY) subqueries, the optimizer has these choices:

  • Semi-join

  • Materialization

  • EXISTS strategy

For NOT IN (or <>ALL) subqueries, the optimizer has these choices:

  • Materialization

  • EXISTS strategy


这是在说:
1 对于“IN (or =ANY)”类型的子查询,有3种优化策略
2 对于“NOT IN (or <>ALL)”类型的子查询,有2种优化策略
但是,其中提到了“EXISTS strategy”,有朋友问,这个“EXISTS strategy”是什么含义?

二 问题
我们暂且不提这个问题,先从整体上,理解一下子查询通常的优化方式,然后再来谈MySQL的“EXISTS strategy”是什么含义?

在“ToprowDB Dynamic Server 查询优化技术---子查询优化--03-1”一文中,介绍了优化的技术的本质,先读这一篇文章,有助于了解子查询优化技术。
总结子查询的优化方式,通常如下:
F1 使用semi-ji
on来优化子查询,即把 子查询消除,上拉后使用“半连接”操作符来做表的连接,这是最常规的优化方式
F2 对于不可semi-jion(不全是这样,但多数是)的子查询,如果是非相关子查询,则物化子查询,这也是比较常用的优化方式
F3 对于不可优化的子查询,则连接时依旧存在子查询,这样的方式,其实是没有做优化的

三 更多细节问题
    但是,子查询优化的细节,还有很多,例如:
1 “
A semi B”是否能够变为“B JION A”?
2 “A semi B”对于B使用什么样的物理操作符?如果B上存在索引,是否可以利用索引?
3 MySQL的semi jion的策略怎么有5个(DuplicateWeedout、FirstMatch、LooseScan、Materializelookup、MaterializeScan)?
这些内容将来单独成文进行探讨。

四 EXISTS优化策略辨析
回到我们在文章初始提出的问题:
MySQL的“EXISTS strategy”是什么含义?
首先,意味着是前述的"F1":
1 首先,子查询本质上没有被优化
2 但是,子查询被做了一些调整,调整的方式在开篇给出的链接中给出(
http://dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html),我们摘录如下:

对于如下的子查询,

outer_expr IN (SELECT inner_expr FROM ... WHERE subquery_where)
被优化为:
EXISTS (SELECT 1 FROM ... WHERE subquery_where AND
        (outer_expr=inner_expr OR inner_expr IS NULL))
这就是所谓的
EXISTS strategy”。
至于为什么被优化为如上的形式,可以参阅:
http://dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html
的“
Optimizing Subqueries with EXISTS Strategy”节内容。


上一篇:一点.NET学习资源
下一篇:排序算法:二叉排序树

相关文章

关键词: MySQL子查询--

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款