求助sql语句,多个join嵌套

Linux上查看内存的使用情况该用什么命令

可以看到内存或者缓存情况

但是这句清楚缓存的语句不能在线上执行这条命令。

SQL中的join可以根据某些条件把指定的表给结合起来并将数据返回给客户端

在项目开发中如果需要使用join语句,如何优化提升性能?

  1. 数据规模较小 全部干进内存就完事了嗷

可以通过增加索引来优化join语句的执行速度 可以通过冗余信息来减少join的次数 尽量减少表连接的次数,一个SQL语句表连接的次数不要超过5次

在执行join语句的时候必然要有一个比较的过程

逐条比较两个表的语句是比较慢的,因此我们可以把两个表中数据依次读进一个内存块中, 以MySQL的InnoDB引擎为例,使用以下语句我们必然可以查到相关的内存区域show variables like '%buffer%'

图中的,join_buffer_size的大小将会影响我们join语句的执行性能。

任何项目终究要上线,不可避免的要产生数据,数据的规模又不可能太小。大部分数据库中的数据最终要保存到硬盘上,并且以文件的形式进行存储。

  • InnoDB会为每个表创建用于存储数据的.ibd文件

这意味着我们有多少表要连接就需要读多少个文件,虽然可以利用索引,但还是免不了频繁的移动硬盘的磁头。频繁的移动磁头会影响性能。

面试官:再给你个机会,如果让你来实现Join算法你会怎么做?

我:无索引的话,嵌套循环就完事了嗷。有索引的话,则可以利用索引来提升性能.

我:在扫描过程中,数据库会选择一个表把他要返回以及需要进行和其他表进行比较的数据放进join_buffer

面试官:有索引的情况下是怎么处理的?

我:这个就比较简单了,直接读取两个表的索引树进行比较就完事了嗷,我这边介绍一下无索引的处理方式

上学时,数据库老师最喜欢考数据库范式,直到上班才学会一切以性能为准,能冗余就冗余,实在冗余不了的就join如果join真的影响到性能。试着调大你的join_buffer_size, 或者换固态硬盘。

  • 现在的情况是页面添加信息失败,我实在不知道哪出问题了数据库创建语句:php语句:能在客户端写入信息,但是 id 留空不行,不是已经设置了atuo_increment ,为什么id还是不能自增啊?这个教程是16年的完整php代码:...

  • 没有解决我的问题, 去提问

我正在研究其他人的PHP代码并一遍又一遍地看到这种模式:

如果另一个表中没有相关的行,代码需要分支,但是通过在单个SELECT语句中执行LEFT JOIN不能更好地完成此操作吗?我错过了一些性能优势吗?便携性问题?或者我只是在挑剔?

这绝对是错误的。你无缘无故地第二次越过电线。数据库在他们的问题空间非常快。连接表就是其中之一,你会看到更多的性能从第二个查询到连接的性能下降。除非你的表空间是数以亿计的记录,否则这不是一个好主意。

没有足够的信息来真正回答这个问题。我一直致力于减少查询计数的应用程序,原因之一是由于另一个原因而增加查询次数两者都提高了性能。在同一个应用程序中!

对于表大小,数据库配置以及查询外表的频率的某些组合,执行这两个查询可能比LEFT JOIN快得多。 但经验和测试是唯一可以告诉你的事情。具有中等大小表的MySQL似乎对此很容易接受,IME。在一个表上执行三个查询通常比一个查询加入三个查询要快得多。我已经看到了一个数量级的加速比。

我和你在一起 - 单个SQL会更好

将SQL DBMS视为ISAM文件系统存在危险,一次只能从一个表中进行选择。将单个SELECT与外部联接一起使用可能更清晰。另一方面,在应用程序代码中检测null并根据null与非null决定做什么也不是完全干净。

单个语句的一个优点 - 您可以减少到服务器的往返次数 - 尤其是每次需要其他结果时动态准备SQL。

平均而言,单个SELECT语句更好。它为优化器提供了一些可以做的事情,并且保存得太闷了。

在我看来,你所说的内容是相当有效的 - 为什么在一个人做的时候会发出两次对数据库的调用 - 除非两个记录都是作为对象独立需要的(?)

当然,虽然在数据库的一次调用中将它全部拉回来并将字段分成两个单独的对象可能不是那么简单的代码,但它确实意味着你只依赖于数据库打电话而不是两个......

这可以更好地作为查询阅读:

通过这种方式,您可以检查您是否一次性获得了结果并让数据库在一个查询中完成所有繁重的工作,而不是两个......

是的,我认为你所说的似乎是正确的。

最可能的解释是开发人员根本不知道外连接是如何工作的。这种情况非常普遍,即使是在自己专业方面经验丰富的开发人员也是如此。

还有一个普遍的说法是“加入查询的速度很慢”。因此,许多开发人员不惜一切代价盲目地避免加入,即使是在运行多个查询的情况下也会更好。

避免连接的神话就像说我们应该避免在应用程序代码中编写循环,因为多次运行一行代码显然比运行一次要慢。更不用说++i的“开销”并在每次迭代中测试i<20

完全正确的是单一查询是要走的路。为了给其他答案添加一些价值,让我添加这个公理:“使用正确的工具完成工作,数据库服务器应该处理查询工作,代码应该处理程序工作。”

这个概念背后的关键思想是,如果编译器/查询优化器知道整个问题域而不是其中的一半,那么编译器/查询优化器可以做得更好。

考虑到在一个数据库中,您拥有所需的所有数据,只需一个SQL语句就可以在99%的时间内获得更好的性能。在这种情况下不确定连接是否正在动态创建,但如果这样做则很昂贵。即使重用现有连接的过程,DBMS也没有优化查询,这是最好的方式,而不是真正利用这些关系。

出于性能原因,我能看到这样的调用的唯一方法是,外键检索的数据量很大而且在某些情况下只需要它。但是在你描述的样本中它只是抓住它,如果它存在,所以情况并非如此,因此没有获得任何性能。

所有这一切的唯一“问题”是,如果要使用的结果集包含大量连接,甚至是嵌套连接。

我现在有两个或三个实例,我继承的原始查询由一个查询组成,其中有很多连接,并且SQL需要花费很长时间来准备语句。

我回到过程中,利用了一些表变量(或临时表),并将查询分解为许多较小的单一选择类型语句,并以这种方式构造最终结果集。

这个更新大大地将响应时间缩短了几秒钟,因为更容易做很多简单的“一次性”来检索必要的数据。

我不是要在此反对反对意见,而只是指出代码可能已被细分到如此精细的级别以解决类似的问题。

单个SQL查询会带来更高的性能,因为SQL服务器(有时不共享相同的位置)只需要处理一个请求,如果您使用多个SQL查询,那么您会引入大量开销:

可能会出现性能可能更好的特殊情况,但对于简单的事情,您可以通过多做一些工作来达到更好的性能。

执行简单的两个表连接通常是解决此问题域的最佳方法,但是根据表的状态和索引,在某些情况下,执行两个select语句可能更好,但通常在我开始接近3-5个连接表之前,我没有遇到过这个问题,而不仅仅是2个。

请确保您在两个表上都有覆盖索引,以确保您没有扫描磁盘上的所有记录,这是数据库获得的最大性能损失(在我有限的经验中)

您应始终尽量减少对数据库的查询次数。您的示例仅适用于1个查询。这样您以后可以更容易地缓存或同时处理更多请求,因为不是总是使用需要连接的2-3查询,而是每次只有1个。

有许多案例需要不同的解决方案,而且无法一起解释。

Join扫描表和循环以匹配第二个表中的第一个表记录。在许多情况下,简单选择查询将更快地工作,因为它只关注主/唯一密钥(如果存在)以在内部搜索数据。

我要回帖

更多关于 sql语句最多嵌套几次 的文章

 

随机推荐