避免嵌套查询有多重要。

我一直学会避免像瘟疫一样躲避它们。但是对我来说,它们是最自然的事情。在设计查询时,我首先写的是嵌套查询。然后,我将其转换为联接,有时需要花费很多时间才能正确。而且很少会带来很大的性能提升(有时确实会提高)

他们真的那么糟糕吗?有没有一种方法可以使用没有临时表和文件排序的嵌套查询

最佳答案

这确实取决于我遇到的情况,我可以通过使用子查询来改进一些查询。

我知道的因素有:

  • (如果子查询使用外部查询中的字段进行比较)(是否为correlated)
  • 如果外部查询和子查询之间的关系被索引
  • 覆盖
  • 如果联接上没有可用的索引,并且子查询没有关联并且返回较小的结果,则使用它可能会更快
  • 我还遇到了以下情况:将使用order by的查询转换为不使用该查询的查询,然后将其转换为简单的子查询并进行排序,从而提高了mysql
  • 的性能。

    无论如何,测试不同的变体(请使用SQL_NO_CACHE)总是好的,将相关查询转换为联接是一个好习惯。

    我什至会称其为非常有用的做法。

    如果您首先想到了相关查询,则可能不是您主要考虑集合操作,而是考虑过程操作以及处理关系数据库时,完全采用集合是非常有用的数据模型的观点及其转换。

    编辑:
    程序vs关系
    在一些集合代数表达式中,根据集合运算与过程的思考可以归结为对等,例如,对一个并集的选择等同于选择的并集。两者之间没有区别。
    但是,当您比较这两个过程时,例如将选择标准应用到具有make union的并集的每个元素上,然后应用选择,则这两个过程是截然不同的过程,它们可能具有非常不同的属性(例如,CPU利用率,I / O,内存)。

    关系数据库背后的想法是,您不会尝试描述如何获得结果(过程),而只是描述您想要的结果,并且数据库管理系统将决定满足您请求的最佳路径(过程)。这就是为什么SQL称为4th generation language (4GL)的原因。

    可以帮助您做到这一点的技巧之一是提醒自己,元组没有固有的顺序(集合元素是无序的)。
    另一个人意识到关系代数非常全面,并且可以将请求(要求)直接转换为SQL(如果模型的语义很好地表示了问题空间,或者换句话说,如果表和关系的名称附带的含义正确完成) ,换句话说,如果您的数据库设计合理)。

    因此,您不必思考如何,只需思考什么。

    在您的情况下,它只是优先于相关查询,所以可能我没有告诉您任何新内容,但您强调了这一点,因此是评论。

    我认为,如果您完全满意将查询从一种形式转换为另一种形式的所有规则(诸如分布性的rules),则您将不希望使用关联子查询(所有形式都相等)。

    (注意:上面讨论了理论背景,对于数据库设计很重要;实际上上述概念有所不同-并非所有等效的查询重写都必须以快速执行,因为集群主键确实会使表在磁盘上具有继承顺序,等等..偏差只是偏差;并非所有等效查询都执行得这么快的事实是实际DBMS的缺陷,而不是其背后的概念)

    关于sql - 避免嵌套查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2778791/

    10-11 02:14
    查看更多