我有一个如下所示的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”,这会降低速度。有什么方法可以优化吗?
答案 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的经过时间比有问题的时间短几倍。
让我尝试做更多优化:)