gpt4 book ai didi

mysql - SQL Join 条件优化

转载 作者:行者123 更新时间:2023-11-29 03:02:43 26 4
gpt4 key购买 nike

我遇到了一个缓慢的 SQL 查询问题,导致我遇到 500 Internal Server Error

在对查询进行了一些尝试之后,我发现将连接条件移到外部可以使查询正常运行并且错误消失。

现在我想知道:

  • 第二个查询是否等同于第一个查询?
  • 我的错误是什么,为什么这么慢?

这里是查询。

原始(慢)SQL:

SELECT *
FROM `TABLE_1` AS `main_table`
INNER JOIN `TABLE_2` AS `w`
ON main_table.entity_id = w.product_id
LEFT JOIN `TABLE_3` AS `ur`
ON main_table.entity_id = ur.product_id
AND ur.category_id IS NULL
AND ur.store_id = 1
AND ur.is_system = 1
WHERE (w.website_id = '1')

更快的 SQL:

SELECT *
FROM `TABLE_1` AS `main_table`
INNER JOIN `TABLE_2` AS `w`
ON main_table.entity_id = w.product_id
LEFT JOIN `TABLE_3` AS `ur`
ON main_table.entity_id = ur.product_id
WHERE (w.website_id = '1')
AND ur.category_id IS NULL
AND ur.store_id = 1
AND ur.is_system = 1

最佳答案

第二个查询是否等同于第一个?

根据 TABLE_3 中的数据,第二个查询不等同于第一个查询,因为您使用的是 LEFT JOIN

考虑当您在 TABLE_1 中有一条记录时会发生什么,其中的 entity_id 与 TABLE_3 中的任何行都不匹配:您的第一个查询仍然会从 TABLE_1 返回该记录,并且 TABLE_3 的所有列都为 NULL 值。第二个查询将过滤器应用于 TABLE_3 中的列,但由于这些都是 NULL,因此记录现在被过滤掉了。

一般来说,查询 2 返回的记录比查询 1 少(当然,除非您的所有 entity_id 都与 TABLE_3 中的 product_id 相匹配)。

我的错误是什么,为什么这么慢?

这两个查询都是有效的 SQL,因此它们都不应该给您一个 500 内部服务器错误。这看起来甚至不像是 MySQL 错误,所以该错误可能出现在其他地方?也许您的 Web 应用程序无法处理从第一个查询返回的 NULL?如果没有有关错误的更多详细信息,则无法回答问题。

至于查询速度,这在很大程度上取决于定义的索引。一般来说,我不希望第二个查询比第一个查询快,但这要视情况而定。正如我上面提到的,第一个查询可能返回比第二个查询更多的记录。如果您不是直接查询数据库,而是通过某个应用程序查询,会不会是应用程序减慢了您的查询速度?

关于mysql - SQL Join 条件优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20630599/

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