在与表B一起使用时获得表A的DISTINCT行的有效方法

时间:2014-07-24 02:37:15

标签: mysql sql join query-optimization distinct

简单的问题。给出示例表:

表A:

id | type
---+-----
1  | A
2  | B
3  | C

表B:

id | a_id | type
---+------+-----
1  | 1    | X
2  | 2    | Y
3  | 1    | X
4  | 3    | Z

(还有其他列,我省略了,以澄清问题)

查询:

SELECT a.*
FROM a a
INNER JOIN b b ON b.a_id = a.id
WHERE b.type = 'X'

结果

id | type
---+-----
1  | A
1  | A

SQL小提琴http://sqlfiddle.com/#!2/e6138f/1

但我只想要表A的不同行。我知道,我可以SELECT DISTINCT a.*,但我们的表A有大约40列,而这个SELECT可以返回100-10000行。如果数据库必须比较每一列,那是不是非常慢?

或者MySQL是否足够智能,只关注DISTINCT操作的主键?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

使用exists代替显式联接:

select a.*
from tablea a
where exists (select 1 from tableb b where b.a_id = a.id and b.type = 'x');

为了提高效果,请在tableb(a_id, type)上创建索引。