Mysql

將堆轉換為 MyISAM 問題

  • February 2, 2021

在工作中,我們遇到了不止一次出現的問題。

問題是查詢處於將 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_sizemax_heap_table_size設置為 16K。這樣,臨時表將更快地進入磁碟。順便說一句,是的,它們應該是相同的值。如果您不將這些設置為小,則會發生以下情況:

  • 記憶體中的臨時表增長到 8G
  • mysqld 暫停查詢處理
  • mysqld 將臨時表解除安裝到磁碟(全部 8G
  • mysqld 恢復填充臨時表
  • mysqld 繼續查詢處理

CAVEAT:您可能需要將基於磁碟的臨時表映射到單獨的磁碟。您可以使用tmpdir將所有此類臨時表指向該指定卷。我給你提個醒的原因是什麼?

根據MySQL 5.0 認證學習指南

在此處輸入圖像描述

第 408,409 頁第 29.2 節 Bulletpoint 11 說:

如果在向 MyISAM 表添加行時磁碟空間不足,則不會發生錯誤。伺服器暫停操作,直到空間可用,然後完成操作。

因此,您需要大量空間用於磁碟上的臨時表。我之前提到過這一點(參見我的舊文章“Site Offline” MySQL 伺服器無法啟動和停止

建議 #2

調整其他每個連接的設置。如果您設置join_buffer_sizesort_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 如何使用內部臨時表

引用自:https://dba.stackexchange.com/questions/86783