从数据库中检索数据时,我有一个疑问。 有两个表和主表id始终插入到其他表中。
我知道数据可以通过加入从两个表中检索,但想知道, 如果我首先从主表中检索所有我想要的数据,然后在循环中(在编程语言中)加入到其他表并检索数据,那么这是有效的,为什么。
答案 0 :(得分:1)
就效率而言,规则是您希望最小化到数据库的往返次数,因为每次旅行都会增加很多时间。 (如果数据库与调用它的应用程序位于同一个盒子上,这可能不是什么大不了的事。在数据库中我居住的世界永远不会与应用程序在同一个盒子上。)拥有应用程序循环意味着你创建了一个为主表中的每一行访问数据库,因此操作所需的时间与主表行的数量呈线性增长。
请注意,在开发或测试环境中,如果测试数据不是很多,您可能会无法进行低效查询。在生产中,您可能会看到比您测试的数据更多的数据。
答案 1 :(得分:0)
在数据库中工作更有效率,在更少的大型查询中,但除非网站或程序非常繁忙,否则我怀疑它会对循环产生很大影响在数据库内部或数据库外部。如果它是一个网站应用程序,那么在数据库外部循环大循环并等待结果将花费更多的时间。
答案 2 :(得分:0)
您所描述的内容有时被称为 N + 1问题。 1是您对主表的第一个查询,N是针对您的详细信息表的查询数。 / p>
这几乎总是错误的表现。*
问题通常与使用ORM有关。 ORM查询您的数据库实体,就好像它们是对象一样,错误是假设实例化数据对象并不比创建对象更昂贵。但是,当然你可以编写自己做同样事情的代码,而不使用ORM。
隐藏的成本是您现在拥有自动运行N个查询的代码,N由主表中匹配行的数量决定。当10,000行与您的主查询匹配时会发生什么?在您的数据库需要在运行时执行这些查询之前,您不会收到任何警告。
可能没必要。如果主查询匹配10,000行,但实际上只需要有详细行的27行(换句话说是INNER JOIN
),该怎么办。
由于网络开销,有些人担心查询的数量。我并不那么担心。您的应用和数据库之间不应该网络速度较慢。如果你这样做,那么你遇到的问题比N + 1问题更严重。
我更关心的是,当您不必要时,每秒运行数千个查询的开销。开销在内存中,并且需要在服务器进程中解析和创建SQL语句所需的所有代码。
只是Google for" sql n + 1问题"并且你会有很多人讨论这是多么糟糕,以及如何在你的代码中检测它,以及如何解决它(剧透:做一个JOIN)。
*当然,每个规则都有例外,因此要为您的应用程序解决此问题,您必须使用一些有代表性的数据和流量样本进行负载测试。