这个MySQL转置组是否可以通过查询进行优化?

问题描述 投票:0回答:2

my_table包含290M行,我希望优化以下查询

select
  col1,
  col2,
  group_concat(distinct case when col3=1 then col4 end) c1,
  group_concat(distinct case when col3=2 then col4 end) c2,
  ...
  group_concat(distinct case when col3=70 then col4 end) c70
from my_table
group by col1,col2
order by null

我已经尝试过像这样的小型查询,但整件事情更糟

select
  col1,
  col2,
  group_concat(distinct case when col3=1 then col4 end) c1
from my_table
group by col1,col2
order by null

有办法吗?

mysql query-optimization pivot-table transpose query-performance
2个回答
0
投票

这是一个艰难的,因为你只是在查询一个表。我可以建议以下索引:

CREATE INDEX idx ON my_table (col1, col2, col3, col4);

MySQL可能会选择使用这个索引,因为对于每个(col1, col2)组,它可以进行索引扫描以找到col3的每个值,然后将col4的不同值连接在一起。


0
投票

(请使用真正的列名;那里经常有有用的线索。)

也许这会更快......

首先,让我们看看一次完成所有GROUP_CONCATs的速度有多快:

SELECT col3,
       GROUP_CONCAT(DISTINCT col4) AS list
    FROM my_table
    GROUP BY col3;

这将采取全表扫描(290M行),但它可以加速

INDEX(col3, col4)  -- in this order

这是'覆盖'。

然而,既然你有col1col2混淆了作品,让我们改为

SELECT col1, col2, col3,
       GROUP_CONCAT(DISTINCT col4) AS list
    FROM my_table
    GROUP BY col1, col3, col3;

INDEX(col1, col2, col3, col4)   -- in this order

此时,您拥有所有数据,但需要“转动”它。 (参见[pivot]标签。)

© www.soinside.com 2019 - 2024. All rights reserved.