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

标签 php mysql join union multiple-tables

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

我正在考虑使用 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/

相关文章:

php - Symfony 分析器抛出 404

php - 缓存系统如何为网站工作

php - 使用password_hash错误进行password_verify在登录时将用户存储在 session 中

r - 使用 R 中的 data.table 将 POSIXct 列连接到日期列

php - 无法使用自己的实现覆盖 Laravel Spark 身份验证

php - MySQL 存储好友

mysql - 在另一个表中搜索文本中的所有关键字

mysql - 我如何做一个不区分大小写的 mysql 包含字符串

mysql - 复杂的mysql查询连接两个表并显示所有记录

linux - 根据共同的 2 列正确连接两个文件 :