2010-07-09 37 views
5

首先,我是優化mysql的新手。事實是,我在我的Web應用程序中(每秒約400個查詢),使用我無法避免的GROUP BY的查詢,這是創建臨時表的原因。我的配置是:最佳的MySQL臨時表(內存表)配置?

max_heap_table_size = 16M 
tmp_table_size = 32M 

結果:臨時表到磁盤%的+ - 12.5%

然後,我改變了我的設置,根據this post

max_heap_table_size = 128M 
tmp_table_size = 128M 

結果:臨時表到磁盤百分比+ - 18%

結果沒有預料,不明白爲什麼。

這是錯的tmp_table_size = max_heap_table_size? 不應該增加大小?

查詢

SELECT images, id 
FROM classifieds_ads 
WHERE parent_category = '1' AND published='1' AND outdated='0' 
GROUP BY aux_order 
ORDER BY date_lastmodified DESC 
LIMIT 0, 100; 

EXPLAIN

| 1 |SIMPLE|classifieds_ads | ref |parent_category, published, combined_parent_oudated_published, oudated | combined_parent_oudated_published | 7 | const,const,const | 67552 | Using where; Using temporary; Using filesort | 
+1

不需要道歉 - 你的英語很好。 – 2010-07-09 17:48:51

+0

同意OMG小馬;我們希望在英語不太好的情況下,不會有人提問。 – 2010-07-09 18:19:06

+0

你的書面英語比我一起工作的英國本土同事更好! :) – 2010-07-09 18:48:38

回答

9

在EXPLAIN報告並沒有告訴我們的是,臨時表是在磁盤上的 「使用臨時」。它只告訴我們該查詢期望創建一個臨時表。

如果臨時表的大小小於tmp_table_size 小於max_heap_table_size,則臨時表將保留在內存中。

Max_heap_table_size是表中最大的一個表,可以在MEMORY存儲引擎中,無論該表是臨時表還是非臨時表。

Tmp_table_size是一個表,當表由查詢自動創建時,它可以在內存中佔據最大的比例。但無論如何這不能大於max_heap_table_size。所以將tmp_table_size設置爲大於max_heap_table_size沒有任何好處。通常將這兩個配置變量設置爲相同的值。

可以監視多少臨時表被創建,以及有多少磁盤上是這樣的:

mysql> show global status like 'Created%'; 
+-------------------------+-------+ 
| Variable_name   | Value | 
+-------------------------+-------+ 
| Created_tmp_disk_tables | 20 | 
| Created_tmp_files  | 6  | 
| Created_tmp_tables  | 43 | 
+-------------------------+-------+ 

注意,在這個例子中,43個臨時表被創建,但只有20人在磁盤上。

當您增加tmp_table_size和max_heap_table_size的限制時,允許在存儲器中存在更大的臨時表。

你可能會問,你需要做多大?您不一定需要使每個臨時表都足夠大才能適應內存。您可能希望95%的臨時表適合內存,並且只有剩餘的罕見表出現在磁盤上。最後的5%可能會非常大 - 比您想要使用的內存大得多。

所以我的做法是保守地增加tmp_table_size和max_heap_table_size。然後觀察Created_tmp_disk_tables的比率爲Created_tmp_tables,看看我是否達到了讓他們中的95%留在內存中的目標(或者我希望看到的任何比例)。

不幸的是,MySQL沒有一個很好的方法來告訴你究竟臨時表有多大。每個查詢都會有所不同,因此狀態變量無法顯示,它們只能顯示出發生了多少次的計數。 EXPLAIN並不實際執行查詢,因此無法準確預測它將匹配多少數據。

另一種方法是Percona Server,這是一個MySQL的分佈改進。其中之一是log extra information in the slow-query log。包含在額外字段中的是由給定查詢創建的任何臨時表的大小。