2017-04-25 90 views
11

我在數據庫中有很大的(InnoDB)表;顯然用戶有能力通過JOIN製作SELECT,這會導致臨時的大型磁盤(因此磁盤)表。有時候,這些文件太大以至於會耗盡磁盤空間,導致各種奇怪的問題。如何限制臨時表的大小?

有沒有辦法限制臨時表最大大小對於磁盤上的表,以便表不會過度生長磁盤?儘管名稱存在,但tmp_table_size僅適用於內存表。我在documentation中沒有找到任何相關內容。

+0

是的,*我知道存儲很便宜,最好的解決方案是「防止查詢」。但是,這些不在我目前的選項中。 – Piskvor

+0

可以重新制定一些「巨大的」查詢以避免大的tmp表。你可以改變查詢嗎?如果是這樣,請爲每個相關表提供'SELECT ...','EXPLAIN SELECT ...'和'SHOW CREATE TABLE'。縮小tmp表將會加快速度。 –

+1

以下是指導原則(https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html),可以幫助您優化您的查詢。 –

回答

4

還有was a discussion關於選項disk-tmp-table-size,但它看起來像the commit沒有通過審查或因其他原因而丟失(at least the option does not exist in the current code base anymore)。

我想你的下一個最好的嘗試(除了增加存儲空間)是調整MySQL不製作磁盤臨時表。 There are some tips for this on DBA。另一個嘗試可能是創建一個用於存儲「磁盤上」臨時表的ramdisk,前提是您有足夠的RAM並且只有磁盤存儲空間不足。

+0

10多年以後會發生很多事情;我沒有在我的任何服務器上找到這個選項。感謝您提供in-RAM建議,但可惜:對於250 GB的臨時表,這比「獲取磁盤」的可能性更小。 – Piskvor

+0

這似乎是目前唯一的選擇。我也無法找到關於它的更多信息。 –

+0

是的,我也是。因此,賞金。 – Piskvor

1

在MariaDB和MySQL中沒有這個選項。 幾個月前,我遇到了同樣的問題,我搜索了很多,我最終通過在NAS上爲臨時數據集創建了一個特殊的存儲區域來部分地解決了這個問題。

在NAS上創建一個文件夾,或者在內部硬盤上創建一個分區,它的大小將被限制,然後掛載,然後在mysql ini中分配臨時存儲到這個驅動器:(選擇windows/linux)

tmpdir="mnt/DBtmp/" 
tmpdir="T:\" 

mysql服務應該在此更改後重新啓動。

通過這種方法,一旦硬盤滿了,磁盤上的查詢仍然存在「奇怪的問題」,但其他問題已經消失。

+0

雖然不是完整的解決方案,但這似乎是唯一可行的解​​決方法。謝謝。 – Piskvor