优化MySQL自联接

时间:2013-08-20 15:13:12

标签: mysql self-join

我在表上有自己的连接查询,有400万条记录....我们如何优化查询...查询必须获取具有最大日期的行

  SELECT DISTINCT d1.C1 AS c1, d1.C2 AS c2, d1.C3 AS c3,
         d1.datedm_id AS c4 FROM TABLEA d1 LEFT OUTER JOIN TABLEA d2 
         ON (d1.C1 = d2.C1 AND d1.C2 = d2.C2 AND d1.datedm_id < d2.datedm_id ) 
         WHERE d2.C1 IS NULL AND d2.C2 IS NULL

目前此查询需要很长时间才能执行

EXPLAIN显示以下

d1 4051368  Using index; Using temporary
d2 1    Using where; Using index; Not exists; Distinct

2 个答案:

答案 0 :(得分:0)

要优化此查询,请在tableA(C1, C2, datedm_id)上构建索引。

您可以将其重写为:

SELECT d1.C1 AS c1, d1.C2 AS c2, d1.C3 AS c3, d1.datedm_id AS c4
FROM TABLEA d1
WHERE not exists (select 1
                  from TABLEA d2 
                  where d1.C1 = d2.C1 AND d1.C2 = d2.C2 AND d1.datedm_id < d2.datedm_id
                 );

这个版本肯定应该使用索引。第一个版本应该,但可能不是在所有情况下。

答案 1 :(得分:0)

试试这个:

select d1.C1 AS c1, d1.C2 AS c2, d1.C3 AS c3,
     d1.datedm_id AS c4 FROM TABLEA d1
where not exists(
  select 'nextdatedm'
  from TABLEA d2
  where d1.C1 = d2.C1 AND d1.C2 = d2.C2 AND d1.datedm_id < d2.datedm_id
)

我用EXISTS函数替换了你的LEFT OUTER JOIN(在这个解决方案中,我只得到TABLEA,其中不存在另一行,其中datem更年轻)。

通过这种方式,您可以删除DISTINCT函数。

要完成任务,您可以添加一些有关比较字段的索引