gpt4 book ai didi

php - mysql 在 join 和 union 和/或其他之间的搜索速度

转载 作者:行者123 更新时间:2023-11-29 06:18:54 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

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

另外,请注意:

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

  2. 这是 LEFT JOIN 的一种非常新颖的用法。通常,它用于关联两个不同表中的行。在本例中,您将使用它“并排”生成三个单独的结果集。大多数 SQL 程序员必须仔细查看此语句一段时间才能弄清楚您的意图。

关于php - mysql 在 join 和 union 和/或其他之间的搜索速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4783088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com