Mysql 查询占用了太多磁盘空间

Posted

技术标签:

【中文标题】Mysql 查询占用了太多磁盘空间【英文标题】:Mysql query is consuming too much space on disk 【发布时间】:2015-10-20 13:47:00 【问题描述】:

我正在尝试在 mysql 上运行以下查询:

SELECT column1, column2, count(distinct t2.iduser)
 FROM table1 t1 
 LEFT JOIN table2 t2 ON t2.id = t1.id
 LEFT JOIN huge_table h ON h.column = t2.vouchercode 
 AND h.client IN (23, 42, 47, 50, 55, 54, 53) 
 AND h.id >= 1111
 AND h.starttime >=  '2015-01-01 04:00:00'  
 AND h.endtime <=  '2016-01-01 03:59:59'
 GROUP BY t1.id;

huge_table 有大约 2000 万行和 26 列,但我只需要其中的 5 个来过滤。我认为那 21 个多余的列占用了太多空间(大约 20GB!在 100 秒内)。有什么方法可以只隔离 5 个需要的列,以便使用更少的空间?还是其他不使用 join 的形式?

或者还有其他什么原因会消耗这么多空间?

**** 更新 ****

这是原始查询:

SELECT voucherprefix, 
description, 
count(distinct v.iduser) as usersVolume 
FROM vc vc 
LEFT JOIN voucher v ON v.idvouchercontrol = vc.idvouchercontrol 
LEFT JOIN radacct r ON r.username = v.vouchercode 
WHERE 1 = 1 
AND r.calledstationid IN (23, 42, 47, 50, 55, 54, 53) 
AND r.radacctid >= 695106 
AND r.acctstarttime >=  '2015-01-01 04:00:00'  
AND r.acctstarttime <=  '2016-01-01 03:59:59'
GROUP BY vc.idvouchercontrol;

他的解释:

 '1', 'SIMPLE', 'radacct', 'range', 'PRIMARY,username,acctstarttime', 'PRIMARY', '8', NULL, '5915245', 'Using where; Using temporary; Using filesort'
 '1', 'SIMPLE', 'v', 'ref', 'vouchercode,sub_index', 'vouchercode', '63', 'func', '1', 'Using where'
 '1', 'SIMPLE', 'vc', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'v.idvouchercontrol', '1', ''

【问题讨论】:

请注意,DISTINCT 不是函数,我认为列不是问题 谢谢,我已经更新了查询。 我们能否查看您的实际查询,并在查询中明确说明从哪个表中选择了每一列(以及相同的 EXPLAIN) 尝试使用查询提示 我已经添加了原始查询和解释 【参考方案1】:

为解决此问题,我已将 LEFT JOIN 上的 t2.vouchercode 替换为索引列,查询运行速度更快且不会占用太多空间。

【讨论】:

以上是关于Mysql 查询占用了太多磁盘空间的主要内容,如果未能解决你的问题,请参考以下文章

系统存储在 macOS Mojave 中占用了太多空间

确定哪个表在 MySQL 中占用最多的磁盘空间

Linux下查看MySQL占用磁盘空间大小

JFrame 中的 JTextField 在实际文本字段之外占用了太多空间

对于mysql数据库优化的见解

sql数据库莫名奇妙的变大了 非常占用磁盘空间