【问题标题】:mysql search speed between join and union and/or other连接和联合和/或其他之间的mysql搜索速度
【发布时间】:2011-01-24 14:25:04
【问题描述】:

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

我正在考虑使用 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"
';

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

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

【问题讨论】:

    标签: php mysql join union multiple-tables


    【解决方案1】:

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

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

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

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

    另外,请注意:

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

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

    【讨论】:

    • 哦,不,我简化了那里的所有内容 :) 这是一个示例 sql,我也根本不使用*,但每个表都有一个标题、内容字段和几个公共字段,这就是我将搜索并忽略其余部分。我仍然处于十字路口,不知道处理多表搜索的最佳方法是什么
    • 好吧,除非您的示例与简化示例的结构不同,否则我对 LEFT JOIN 方法列出的所有反对意见仍然适用。
    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2020-08-28
    • 2019-04-20
    相关资源
    最近更新 更多