第一句:
SELECT DISTINCT(t1.user_id) FROM table_users as t1 WHERE t1.user_town IN (SELECT t2.town FROM table_towns as t2)
第二句:
SELECT DISTINCT(t1.user_id) FROM table_users as t1
INNER JOIN (SELECT t2.town FROM table_towns as t2) as t3 ON t1.user_town = t3.town
我使用的选择通常有点复杂。 在可能的情况下,我尝试使用IN(...),因为我可以传递值或表选择。
答案 0 :(得分:1)
它们看起来与我的眼睛非常相似。鉴于MySQL is not particularly good with subqueries:
,我非常确定单个SELECT将提供更好的性能SELECT t1.*
FROM table_users t1
INNER JOIN table_towns t2 ON t1.user_town = t2.town
在任何情况下,您都应该看到查询的EXPLAIN plan必须说明什么,并对实时数据执行一些基准测试。
答案 1 :(得分:0)
您应该对其进行衡量,并发布解释计划以确定。但我不会使用这些:
select u.* from table_users as u
inner join table_towns as t on u.user_town = t.town
答案 2 :(得分:0)
IN
正在杀死MySQL。而是使用EXISTS
。
INNER JOIN
可以非常快,但结果不一定相同。您可能需要分组或distinct
以获得相同(或类似)的结果,但在这种情况下我认为您是安全的。
如果使用内连接,请不要将其设为子选择,因为MySQL也不能很好地处理这些连接。只需加入table_towns表本身即可。
答案 3 :(得分:0)
你的问题没有明确的答案。这实际上取决于表上的索引以及您使用的DBMS是否可以使用它们。与IN
和INNER JOIN
更快的实例相比,我有INNER JOIN
缩短执行时间的实例。
轶事示例(尽管使用SQL Server):
我使用公共字段将临时表加入常规表。当我查看执行计划时,执行计划在两个表之间显示了HASH JOIN。执行时间为2秒aprox。我使用INNER JOIN
将IN
更改为subselect
,HASH JOIN消失,执行时间缩短为1秒aprox。它现在使用主表上的索引。
答案 4 :(得分:0)
您发布的2个查询可能会产生不同的结果(第二个使用JOIN可以返回比第一个更多的行),所以我认为比较性能不正确。