我在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错误,所以也许该错误出现在其他地方?也许您有一个无法处理从第一个查询返回的 NULL 的 Web 应用程序?如果没有有关错误的更多详细信息,就不可能回答问题。
至于查询的速度,这在很大程度上取决于定义了哪些索引。通常,我不希望第二个查询比第一个查询更快,但这取决于。正如我上面提到的,第一个查询可能比第二个查询返回更多的记录。如果您不是直接查询数据库,而是通过某个应用程序查询,可能是应用程序减慢了查询速度吗?