0

我正在 PHP Web 应用程序中设计一个中央搜索功能。它专注于单个表,每个结果都是该表中的一个唯一 ID。不幸的是,有几十个表与这个中心表相关,其中大多数是 1:n 关系。更不幸的是,我需要加入其中不少。一对夫妇收集必要的数据以显示结果,一对夫妇根据搜索条件进行过滤。

我一直主要依靠一个查询来做到这一点。它有很多连接,因为每个 ID 应该只显示一个结果,它也适用于相当复杂的子查询和按用途分组。它还根据用户设置的排序方法进行排序,并且通过使用 LIMIT 也可以进行分页。

无论如何,这个查询已经变得异常复杂,虽然我很好地用 PHP 构建了它,但它是一个需要更改或调试的 PITA。因此,我一直在考虑另一种方法,在我实际开发它之前,我想知道这对性能有多糟糕(或不是?)。思路如下:

  • 运行一个不太复杂的查询,仅根据搜索参数进行过滤。这意味着更少的连接,我可以完全忽略 group by 和类似的结构,我只会在此“SELECT DISTINCT item_id”并获取 ID 列表

  • 然后运行另一个查询,这次只加入我需要使用... WHERE item_id IN (....) 显示结果(仅占当前总连接数的 1/4)的表,传递“有效的”列表" 在第一个查询中收集的 ID。

注意:显然 IN() 实际上可以包含完整的第一个查询,而不是依赖 PHP 来构建一个逗号分隔的列表)。

IN 在性能方面会有多糟糕?我根本无法限制第一个查询对我的伤害有多大?我也想知道这是否是一种常见的方法,或者是否有更智能的方法来做到这一点。我会感谢您对此的任何意见:)

注意澄清:我们不是在这里谈论一些简单的连接。那里甚至有(简单的)分层数据,我需要将搜索参数与项目自己的数据以及其父数据进行比较。在我从事过的任何其他项目中,我都没有遇到过接近这种复杂性的查询。甚至在你说之前,是的,数据本身具有这种固有的复杂性,这就是数据模型也很复杂的原因。

4

1 回答 1

0

我的经验表明,使用这种WHERE IN(...)方法往往会更慢。我会加入连接,但请确保您首先加入最小的数据集。减少简单的主表,然后加入它。确保将最复杂的连接保存到最后,以最大限度地减少搜索所需的行。尽可能尝试加入索引以提高速度,并尽可能在 JOINS 中放弃通配符。

但我同意 Andomar 的观点,如果你有时间同时构建和测量。

于 2013-03-25T14:02:19.037 回答