【问题标题】:MySQL group by query consuming a 20x of disk spaceMySQL group by 查询消耗 20 倍的磁盘空间
【发布时间】:2019-12-01 08:14:08
【问题描述】:

我有一个 40 GB 磁盘空间的表,大约 500 MM 行。 我正在运行一个查询

select col0 , col1, group_concat('(', col2 , ',' , col4 , ')') as 
str from table
group by col0, col1

当我运行查询时,磁盘空间利用率直线上升了 20 倍,并且我的节点空间不足。

如此高的磁盘使用率背后的原因是什么?也许,这可能与 group by 在 mysql 中的工作方式有关

我可以在查询中做些什么不同的事情来获取我正在寻找的数据?

【问题讨论】:

  • 我可能会想到两件事,但我不知道是哪一个。一个是分组只占用空间的事实,尤其是在您进行顺序表扫描时。一是默认情况下,大多数客户端库将批量接收结果集。首先是看EXPLAIN。第二个是查看流数据集是否会减少磁盘负载(如果您在(col0, col1) 上有一个合理的索引,我认为这可能是可能的)。但是你没有发布EXPLAIN,没有架构,也没有客户端库/语言,所以.... shrug

标签: mysql group-by diskspace


【解决方案1】:

Mysql 为中间结果创建临时表。

如果您不关心结果中的行顺序,添加 ORDER BY NULL 可以显着提高性能并减少磁盘使用量。

如果未指定 ORDER BY,则使用 GROUP BY 中的表达式进行排序, 所以GROUP BY col0, col1 等价于GROUP BY col0, col1 ORDER BY by col0, col1

【讨论】:

  • 我在想,如果你得到一个流式结果集,并且有一个 col0, col1 的覆盖索引,那么很有可能你只需要在内存中保存一组数据,而不是一次所有组(您必须使用ORDER BY NULL)。只是一个假设,不能 100% 确定 MySQL 是否会这样做,但这是一个显而易见的优化,所以我有理由相信比我想象的更聪明的人。
  • 使用ORDER BY NULL后磁盘使用没有改善
  • @vinit 请按照 amadan 的要求将 EXPLAIN SELECT ... 的输出和该表的 CREATE TABLE 语句添加到您的问题中。
猜你喜欢
  • 2021-02-13
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多