0

我正在尝试创建一个搜索功能,用户可以在其中键入单词或关键短语,然后显示信息。

我正在考虑使用 LEFT JOIN 添加我需要搜索的所有表,有人告诉我UNION,我有预感它可能比JOIN

所以

$query = '
SELECT * 
FROM t1
  LEFT JOIN t2 
    ON t2.content = "blabla"
  LEFT JOIN t3
    ON t3.content = "blabla"
  [...]
WHERE t1.content =  "blabla"
';

以上是一种好的做法还是我应该研究的更好的方法?

让我走上正确的道路:) 还争论为什么它是错误的,争论为什么你认为你的方法更好,这样它会帮助我和其他人理解这一点:

4

1 回答 1

3

一般来说,凭直觉来“猜测”SQL 引擎的性能是一个坏主意。那里发生了非常复杂的优化,它考虑了表的大小、索引的可用性、索引的基数等等。

在此示例中,LEFT JOIN 是错误的,因为您正在生成半笛卡尔 JOIN。基本上,结果集中的行数比您想象的要多得多这是因为 t1 中的每个匹配行都将与 t2 中的每个匹配行连接。如果在 t1 中匹配 10 行,在 t2 中匹配 3 行,那么您将不会得到 10 个结果,而是 30 个。

即使每个表只保证匹配一行(消除笛卡尔连接问题),很明显 LEFT JOIN 解决方案将为您提供一个非常难以使用的数据集。这是因为您加入的每个表中的内容列将是结果集中的单独列。您必须检查每一列以找出匹配的表。

在这种情况下,UNION 是一个更好的解决方案。

另外,请注意:

  1. 在 SELECT 中使用“*”通常不是一个好主意。它会降低性能(因为必须在结果集中组装所有列),并且在这种情况下,您将失去对每个内容列进行别名的机会,从而使结果集更难处理。

  2. 这是 LEFT JOIN 的一个非常新颖的用法。通常,它用于关联来自两个不同表的行。在这种情况下,您将使用它“并排”生成三个单独的结果集。大多数 SQL 程序员将不得不对这个语句进行一段时间的观察,以弄清楚您的意图是什么。

于 2011-01-24T14:45:45.897 回答