2015-10-20 127 views
0

我想在MySQL運行下面的查詢佔用過多的空間: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有大約20萬行和26列,但我只剩下5人的需要過濾。我認爲那21個剩餘列消耗了太多空間(在100秒內大約20GB!)。有什麼辦法只隔離5個需要的列,以便使用更少的空間?或者其他一些不使用連接的形式?

或者是有一些其他的原因,這麼大的空間被消耗?

**** ****更新

這裏是原始查詢:

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', '' 
+0

注意,DISTINCT不是一個函數,而且我不認爲列問題 – Strawberry

+0

謝謝,我已經更新了查詢。 – dellasavia

+0

我們是否可以看到您的實際查詢,並在查詢中明確指出每個列在哪個表中被選中(和解釋相同) – Strawberry

回答

0

要解決這個問題,我已經取代在LEFT JOINt2.vouchercode被索引的列和查詢是跑的更快,並且不消耗太多的空間。