Mysql 查询占用的磁盘空间过多 space
Mysql query is consuming too much space on disk
我正在尝试 运行 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 个多余的列消耗了太多 space(大约 20GB!在 100 秒内)。有没有办法只隔离 5 个需要的列,从而减少 space 的使用?或者其他一些不使用连接的形式?
还是有其他原因导致消耗了这么多 space?
**** 更新 ****
这是原始查询:
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', ''
为了解决这个问题,我用索引列替换了 LEFT JOIN
上的 t2.vouchercode
,查询速度 运行 更快并且不会消耗太多 space.
我正在尝试 运行 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 个多余的列消耗了太多 space(大约 20GB!在 100 秒内)。有没有办法只隔离 5 个需要的列,从而减少 space 的使用?或者其他一些不使用连接的形式?
还是有其他原因导致消耗了这么多 space?
**** 更新 ****
这是原始查询:
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', ''
为了解决这个问题,我用索引列替换了 LEFT JOIN
上的 t2.vouchercode
,查询速度 运行 更快并且不会消耗太多 space.