这个MySQL换位查询分组是否可以优化?

时间:2019-03-25 09:39:18

标签: mysql query-optimization pivot-table transpose query-performance

my_table包含2.9亿行,我希望优化以下查询

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

有办法吗?

2 个答案:

答案 0 :(得分:0)

这是一个艰难的过程,因为您只针对单个表进行查询。我可以建议以下索引:

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

MySQL 可能选择使用此索引,理由是对于每个(col1, col2)组,它都可以进行索引扫描以找到col3的每个值,然后进行连接col4的不同值。

答案 1 :(得分:0)

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

也许这会更快...

首先,让我们看看一次完成所有var models = ObjectsModel(); var grouped = models.GroupBy(s => s.ObjectsModel.Name) .Select(x => x.Select(y => y)) .ToList(); return View(grouped); @for(int i = 0; i < Model.Count; i++) { <h2>@Html.DisplayFor(model => model[i].First().ObjectsModel.Name)</h2> <ul> for(int j = 0; j < Model[i].Count; j++) { <li>@Html.DisplayFor(model => model[i][j].Object)</li> } </ul> } 的速度有多快:

GROUP_CONCATs

这将进行全表扫描(2.9亿行),但可以加快扫描速度

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

正在“覆盖”。

但是,由于您有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 标签。)