【发布时间】:2014-01-05 00:07:43
【问题描述】:
我遇到了一个缓慢的 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
【问题讨论】:
-
看看以下内容:StackOverflow ;如果结果在
where子句中被过滤,那么它们已经被排除在 Join 之外。 -
希望这篇文章对你有所帮助stackoverflow.com/questions/2509987/…
-
您的第二个查询依赖于在从 TABLE_3 连接之后具有非空值。因此,这实际上是针对 TABLE_3 执行和 INNER JOIN 的。例如,如果前 2 个表有 100 万行匹配,而第 3 个表只有 1 行,那么在您的第一个查询中,您将带回 1m 行,但第二个只会带回 1 行。
标签: mysql sql join query-optimization