gpt4 book ai didi

mysql - 当我只需要 WHERE 子句中连接(右)表中的一列时,是否需要左外连接?

转载 作者:行者123 更新时间:2023-11-29 16:34:30 24 4
gpt4 key购买 nike

我有以下左外连接查询:

SELECT table_left.pk_id, table_left.name
FROM table_left left outer join table_right on table_right.fk_id = table_left.pk_id
WHERE table_right.name like '%entered search value%'

我遇到的问题是 table_right 有超过 1,000,000 行和超过 60 列。该查询大约需要 1 分钟,我认为这是因为它对所有列进行了完整的外连接。我不需要所有的列。我只需要使用一列 (table_right.fk_id),这样我就可以在 WHERE 子句中连接两个表和另一列 (table_right.name)。

我使用外连接是因为我需要在 table_left 中包含在 table_right 中没有行的结果。

任何有助于提高上述查询速度的建议将不胜感激。

这是我拥有的两个表的示例:

+-------------------+
| table_left |
+-------------------+
| pk_id | name |
+-------+-----------+
| 1 | IBM |
+-------+-----------+
| 2 | Facebook |
+-------+-----------+
| 3 | Google |
+-------+-----------+
| 4 | Microsoft |
+-------+-----------+


+--------------------------------------------+
| table_right |
+--------------------------------------------+
| table_right_pk_id | fk_id | job_details |
+-------------------+-------+----------------+
| 1 | 1 | Tester |
+-------------------+-------+----------------+
| 2 | 2 | Toilet Cleaner |
+-------------------+-------+----------------+
| 3 | 2 | Secretary |
+-------------------+-------+----------------+
| 4 | 3 | Developer |
+-------------------+-------+----------------+

我希望能够搜索“姓名”(在 table_left 中)和“job_details”(在 table_right 中),但使用 table_left 列。这是我提出的查询,查询下有一些预期结果:

SELECT table_left.pk_id, table_left.name
FROM table_left left outer join table_right on table_right.fk_id = table_left.pk_id
WHERE table_right.name LIKE '%searchTerm%' OR table_left.name LIKE '%searchTerm%'

示例 1

searchTerm = 'IBM'

结果:

+-------------------+
| result |
+-------------------+
| pk_id | name |
+-------+-----------+
| 1 | IBM |
+-------+-----------+

示例 2

searchTerm = '测试员'

结果:

+-------------------+
| result |
+-------------------+
| pk_id | name |
+-------+-----------+
| 1 | IBM |
+-------+-----------+

示例 3

searchTerm = '微软'

结果:(即使 table_right 中没有记录,仍应返回 Microsoft)

+-------------------+
| result |
+-------------------+
| pk_id | name |
+-------+-----------+
| 4 | Microsoft |
+-------+-----------+

示例 4

searchTerm = '开发人员'

结果:

+-------------------+
| result |
+-------------------+
| pk_id | name |
+-------+-----------+
| 2 | Facebook |
+-------+-----------+

最佳答案

如果您需要返回 table_left 中的所有结果(无论其是否匹配),那么左连接是正确的,就像您正在做的那样,所以不必担心尝试切换它。

The query takes around 1 minute and I think it's because it's doing a full outer join on ALL the columns. I don't need all the columns.

让我们明确一点:联接对您在联接条件中列出的列进行操作:在本例中为 table_right.fk_id 和 table_left.pk_id。但是,您是正确的,非常大的表将需要更长的时间来处理。如果不需要其余的列,最好在执行任何联接之前排除它们,因为输出表的宽度会更小(这意味着返回该输出表时的速度会提高)。

当尝试提高连接性能时,MySQL 的经验法则是使用索引。通俗地说,索引基本上告诉数据库使用特定的列(或多列)作为表的查找。添加索引后速度的提高让我多次感到震惊。

我强烈建议在这种情况下使用索引。这是 great tutorial用于设置这些。祝你好运!

关于mysql - 当我只需要 WHERE 子句中连接(右)表中的一列时,是否需要左外连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53698303/

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