將堆轉換為 MyISAM 問題
在工作中,我們遇到了不止一次出現的問題。
問題是查詢處於將 HEAP 轉換為 MyISAM 的狀態並且它使我們的伺服器癱瘓(在這種狀態下的查詢無法殺死自己,並且只有在我們的情況下似乎需要 FOREVER 的操作之後才評估終止標誌)
以下全域 MYSQL 變數出現在我們面前:
| tmp_table_size | 17179869184 | | max_heap_table_size | 8589934592 |
有什麼想法我們應該做什麼?
我們是否應該調整 tmp_table_size 和 max_heap_table_size 的大小以具有相同的值?
那會有幫助嗎?
您將tmp_table_size設置為 16G,將max_heap_table_size設置為 8G。太大了!!!
如果你有超過 8G 的臨時表,你可以做三 (3) 件事之一
建議 #1
使用較小的值。將tmp_table_size和max_heap_table_size設置為 16K。這樣,臨時表將更快地進入磁碟。順便說一句,是的,它們應該是相同的值。如果您不將這些設置為小,則會發生以下情況:
- 記憶體中的臨時表增長到 8G
- mysqld 暫停查詢處理
- mysqld 將臨時表解除安裝到磁碟(全部 8G
- mysqld 恢復填充臨時表
- mysqld 繼續查詢處理
CAVEAT:您可能需要將基於磁碟的臨時表映射到單獨的磁碟。您可以使用tmpdir將所有此類臨時表指向該指定卷。我給你提個醒的原因是什麼?
第 408,409 頁第 29.2 節 Bulletpoint 11 說:
如果在向 MyISAM 表添加行時磁碟空間不足,則不會發生錯誤。伺服器暫停操作,直到空間可用,然後完成操作。
因此,您需要大量空間用於磁碟上的臨時表。我之前提到過這一點(參見我的舊文章“Site Offline” MySQL 伺服器無法啟動和停止)
建議 #2
調整其他每個連接的設置。如果您設置join_buffer_size和sort_buffer_size,這可以更好地更改查詢的執行計劃。
建議#3
調整您的查詢。如果您可以更改查詢以利用索引或創建支持您擁有的查詢的索引,您可以更快地生成臨時表,如果可能的話,生成更小。
更新 2014-12-27 美國東部時間上午 11:05
你最初問
我們是否應該調整 tmp_table_size 和 max_heap_table_size 的大小以具有相同的值?
不必要。一起使用時,max_heap_table_size會在解除安裝到磁碟之前限制記憶體中臨時表的大小。唯一的例外是使用創建表時
CREATE TABLE ... ENGINE=MEMORY;
有關此的更多資訊,請閱讀 MySQL 文件關於MySQL 如何使用內部臨時表