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
有办法吗?
答案 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
标签。)