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
有办法吗?
这是一个艰难的,因为你只是在查询一个表。我可以建议以下索引:
CREATE INDEX idx ON my_table (col1, col2, col3, col4);
MySQL可能会选择使用这个索引,因为对于每个(col1, col2)
组,它可以进行索引扫描以找到col3
的每个值,然后将col4
的不同值连接在一起。
(请使用真正的列名;那里经常有有用的线索。)
也许这会更快......
首先,让我们看看一次完成所有GROUP_CONCATs
的速度有多快:
SELECT col3,
GROUP_CONCAT(DISTINCT col4) AS list
FROM my_table
GROUP BY col3;
这将采取全表扫描(290M行),但它可以加速
INDEX(col3, col4) -- in this order
这是'覆盖'。
然而,既然你有col1
和col2
混淆了作品,让我们改为
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]
标签。)