我正在使用从 MySQL 发送的数据构建一个 PHP 页面。
是不是更好
- 1 个
SELECT
带有 4 个表连接的查询,或者 SELECT
4 个没有表连接的小查询;我确实从 ID 中选择
哪个更快,每种方法的优缺点是什么?我只需要每个表中的一行。
我正在使用从 MySQL 发送的数据构建一个 PHP 页面。
是不是更好
SELECT
带有 4 个表连接的查询,或者SELECT
4 个没有表连接的小查询;我确实从 ID 中选择哪个更快,每种方法的优缺点是什么?我只需要每个表中的一行。
如果您真的担心,您应该运行一个分析工具,因为它取决于很多事情并且它可能会有所不同,但通常最好编译更少的查询和更少的数据库往返。
确保尽可能使用 where 和 join on 子句过滤事物。
但老实说,这通常无关紧要,因为与数据库可以做的相比,您可能不会受到那么大的打击,所以除非优化是您的规范,否则您不应该过早地做它并做最简单的事情。
通常,最好有一个 SELECT 语句。拥有数据库的主要原因之一是它们处理信息的速度很快,特别是在查询格式的情况下。
如果这种方法有任何缺点,那就是有些类型的分析无法用一个大的 SELECT 语句来完成。RDBMS 纯粹主义者会坚持认为这是一个数据库设计问题,在这种情况下,您将回到我最初的建议。
当您使用 JOIN 而不是多个查询时,您允许数据库应用其优化。您还可能会检索不需要的行(如果您要用多个选择替换 INNER 联接),这会增加您的应用程序服务器和数据库服务器之间的网络流量。即使它们在同一个盒子上,这也很重要。
这可能取决于您从数据库中获取数据后如何处理数据。如果您独立使用这四个结果中的每一个,那么拥有四个单独的 SELECT 语句会更加合乎逻辑和清晰。另一方面,如果您将所有数据一起使用,例如在表中创建统一的行之类的,那么我会使用单个 SELECT 和 JOIN。
我做了一些 PHP/MySQL 的工作,我发现即使对于包含大量 JOIN 的大型表的查询,数据库也非常擅长优化——如果你有智能索引的话。因此,如果您对性能很认真,请开始阅读查询优化和索引。
我会说 1 查询与联接。这样,您只需访问服务器一次。如果你的表是用索引连接的,它应该很快。
好吧,在 Oracle 下,您希望利用查询缓存,如果您在顺序处理中有很多小查询,如果最后一个查询将第一个查询从缓存中推出,那就太糟糕了......正好让您在下一次循环中循环并再次运行第一个查询(显然使用不同的参数值)。
我们正在使用 Java 存储过程构建 XML 输出文件,并且肯定发现每个单独查询的往返时间都在吞噬我们。我们发现在尽可能少的查询中获取所有数据,然后根据需要将这些值插入 XML DOM 会快得多。
唯一的缺点是 Java 代码不太优雅,因为数据获取现在远离它的使用。但是我们必须在尽可能接近零的时间内生成一个大型的复杂 XML 文件,因此我们必须优化速度。
但是,在处理合并表时要小心。根据我的经验,尽管在大多数情况下单个连接可能很好,但当涉及合并表时,您可能会遇到奇怪的情况。