仅选择与某个其他特定表中的行关联的行

时间:2011-08-21 04:24:48

标签: mysql performance associations

table1:
columns: id, name

table2:
columns: id, name

assoc_table1_table2:
columns: id_table1, id_table2

我需要从table1中选择table2中至少有一行与此行相关联的所有行。

什么是有效的方法呢?或者,在某种程度上更正确?

我在考虑:

SELECT DISTINCT t.id, t.name
FROM table1 t
JOIN assoc_table1_table2 a ON t.id=a.id_table1;

或:

SELECT id, name
FROM table1 t WHERE EXISTS (
    SELECT *
    FROM assoc_table1_table2 a
    WHERE t.id=a.id_table1
);

关于上述内容的任何想法通常都会更快?

(明显的指数已到位)

1 个答案:

答案 0 :(得分:1)

都不是。

我建议使用“WHERE EXISTS”,因为它会为优化器提供更多自由。

使用“WHERE COUNT(*)”或DISTINCT将强制进行全表扫描计算。

您只想知道是否存在至少1行,例如,在十亿行表上。一旦db找到第一行,就可以满足“WHERE EXISTS”。在具有合理优化器的数据库上,您会发现它运行良好。