2010-10-22 76 views
11

我們注意到,MySQL報告的臨時磁盤表數量非常大(超過10,000),這是由Server Density報告的。試圖更多地瞭解這一點。高數量的MySQL臨時磁盤表

  • 爲什麼MySQL創建臨時磁盤表?
  • 他們對性能有什麼影響?
  • 他們是否曾被MySQL刪除或這個數字會增加?

回答

15

臨時表可以由許多原因創建。任何具有大數據集且需要排序的選擇操作都將被寫入一個。通過查詢直接創建的實際臨時表(TEMPORARY表類型)是在每個連接的基礎上完成的,所以如果你有一個具有50個連接的腳本,每個連接都做同一個臨時表,那爲他們提供了50套磁盤臨時文件。 臨時表創建的原因組按照順序排列,並且不同於 基於磁盤的I/O是DBMS中最昂貴的部分,通常情況下,如果這些表適用於大型數據集,則可能會限制數據庫性能你的I/O系統。但通常情況下,它們只是咀嚼磁盤空間而不是其他東西。

用於排序目的的臨時表應在查詢完成時自行清理。 'TEMPORARY'類型的臨時表將在它們所連接的連接關閉時自行清理。如果你使用持久連接,那麼TEMPORARY表將會一直存在,直到你(或者一個程序)手動刪除它們。

+0

啊我明白了,所以如果在繁忙的服務器上使用持久連接,我們可能會看到價值增加到一個很大的值,但沒有什麼可擔心的? – Tom 2010-10-30 23:45:11

+1

取決於如何創建表。在連接中創建臨時表'A'是很好的。隨後重新使用連接將重新使用相同的表。但如果你使用隨機名生成它們,你將泄漏這些臨時表,直到連接關閉並且mysql清理完畢。 – 2010-10-31 01:55:48

+0

泄漏到磁盤到內存的位置? – Tom 2010-10-31 17:38:23

1

您已經在表格上定義了許多索引。你有沒有儘管索引如何工作?

索引只是dbase中的一個臨時表,它使索引列的副本保持排序。當一個新的行插入,質數據庫在正確的地方提出了新的紀錄在臨時表這樣一個指數具有以下結果:

A)優點:

1)搜索速度的增加,因爲該表

1)慢下來(創建,更新,刪除),因爲同樣的操作應在臨時表如果需要做:基於索引的字段(一個或多個)

B)缺點在一個臨時表進行排序。

2)數據庫大小因使用臨時表而增加。

結論:

索引是在大數據量的大尺寸分貝和更慢的插入和快速搜索的一個折衷。 在您經常將其引用爲搜索條件(WHERE)的字段上使用索引,並刪除多餘的索引以優化數據庫設計。

6

首先閱讀the answer by Marc B這是關於爲什麼你有很多臨時表的原因。 無論如何,臨時表本身並不壞,壞的是「磁盤上的臨時表」很慢,並導致大量的磁盤IO。

爲了防止臨時表存儲在磁盤上嘗試按以下步驟操作:

  • 檢查max_heap_table_size的價值變量
  • 檢查的tmp_table_size的變量
  • 值檢查所有臨時表中的磁盤表的百分比。 只需比較show global status like 'Created_tmp_%tables'這兩個數字即可。 如果百分比不是太大 - 沒有什麼可擔心的。
+0

max_heap_table_size和tmp_table_size的值是什麼好/壞值? – Tom 2010-10-30 23:46:01

+0

這取決於你的很多項目的具體情況。所以沒有關於價值的一般建議。我可以建議的唯一的事情就是避免使用磁盤臨時表。 – Vadim 2010-11-01 09:51:37