按组合键分组,然后通过MySQL选择一个不同的列

时间:2017-08-24 07:48:32

标签: mysql group-by distinct

我有一个如下所示的MySQL表t_table,它有数百万条记录。

id        c_key1               c_key2      ...
 1          123                 abc
 2          123                 bcd
 3          234                 acd
 4          234                 ads

复合键:composite_key(c_key1,c_key2)。

现在我想做这样的事情:

SELECT 
  DISTINCT c_key1 
FROM
  t_table 
GROUP BY 
  c_key1, c_key2
HAVING 
  COUNT(1) >= 2;

但解释计划有“使用临时;使用filesort”,这会降低速度。有什么方法可以优化吗?

1 个答案:

答案 0 :(得分:0)

SELECT DISTINCT c_key1
    FROM t_table t1 
INNER JOIN 
 (
  SELECT 
    MIN(t3.id) as id 
  FROM 
    t_table t3 
  GROUP BY t3.c_key1, t3.c_key2
  HAVING COUNT(1) >= 2
  ) t2
  ON t2.id = t1.id;

我认为我有一个更好的(也许不是最好的)。解释计划显示t1使用主键,t3使用复合索引。至于派生表,它至少使用临时的,没有文件输出。上述SQL的经过时间比有问题的时间短几倍。

让我尝试做更多优化:)