使用WHERE优化JOIN

时间:2011-07-25 03:50:02

标签: mysql

假设我有2张桌子。第一个表table_1包含每个发布的内容,包括

table_1
   title, 
   author name, 
   email, 
   city_name, etc. 

第二个表提供了table_1的查找。它有2列,

table_2
   city_id and 
   city_name. 

例如,city_id = 1对应纽约,city_id = 2对应芝加哥......依此类推。在table1的“city”列下,列出了city_id,可以很容易地与表2连接,生成可读的城市名称。

以下声明是否与使用带有city_id的WHERE一样有效?原因是我将基于一个字符串的城市过滤结果,我不希望(或需要?)将每个输入与表2中的匹配ID号相关联。

SELECT table1.city, table2.city_name 
FROM table1 
WHERE table2.city_name=(input city name)
JOIN table2.city_name ON table2.city_id = table1.city

2 个答案:

答案 0 :(得分:1)

因为联接是内部联接,所以以下内容应该会导致等效的执行计划。(也就是说,应该 表现出相同的性能特性 - 清楚地编写SQL并让SQL引擎进行脏优化工作。)

如其他答案所示:

SELECT table1.*, table2.city_name 
FROM table1 
JOIN table2 ON table1.city_id = table2.city_id
WHERE table2.city_name = (city_input);

而且,正如我所认为的那样是问题中提出的“优化形式”:

SELECT table1.*, t2.city_name 
FROM table1 
JOIN (SELECT * FROM table2
      WHERE table2.city_name = (city_input)) AS t2
ON table1.city_id = t2.city_id

这是因为SQL遵循的Relation Algebra模型;至少在RA下,这里的相等(“选择”)可以在连接中移动(RA中的“自然连接”),同时保持相同的语义。当然,“为了确定”,运行查询分析。最基本的形式是使用EXPLAIN

快乐的编码。

答案 1 :(得分:0)

我并没有完全遵循问题所在,但我会说处理查询的正确方法,你需要过滤特定的城市名称,而不是ID,就像这样:

 SELECT table1.*, table2.city_name 
 FROM table1 
 JOIN table2 ON table1.city_id = table2.city_id
 WHERE table2.city_name = (city_input);