将堆转换为 MyISAM 问题

Mat*_*vić 3 mysql myisam memory temporary-tables

在工作中,我们遇到了一个问题,现在已经发生了不止一次。

问题是查询处于将 HEAP 转换为 MyISAM 的状态并且它使我们的服务器瘫痪(在这种状态下的查询无法自我终止,并且只有在我们的案例中似乎需要 FOREVER 的操作之后才会评估终止标志)

以下全局 MYSQL 变量出现在我们面前:

| tmp_table_size      | 17179869184 |
| max_heap_table_size |  8589934592 |
Run Code Online (Sandbox Code Playgroud)

任何想法我们应该做什么?

我们是否应该调整 tmp_table_size 和 max_heap_table_size 的大小以具有相同的值?

那会有帮助吗?

Rol*_*DBA 6

您将tmp_table_size设置为 16G,将max_heap_table_size设置为 8G。太大了!!!

如果您有超过 8G 的临时表,您可以执行三 (3) 件事之一

建议#1

使用较小的值。将tmp_table_sizemax_heap_table_size设置为 16K。这样,临时表将更快地进入磁盘。BTW 是的,它们应该是相同的值。如果您不将这些设置小,则会发生以下情况:

  • 临时表在内存中增长到 8G
  • mysqld 暂停查询处理
  • mysqld 将临时表卸载到磁盘(所有 8G
  • mysqld 恢复填充临时表
  • mysqld 继续查询处理

注意:您可能需要将基于磁盘的临时表映射到单独的磁盘。您可以使用tmpdir将所有此类临时表指向该指定卷。我要提醒您注意这一点的原因是什么?

根据MySQL 5.0 认证学习指南

在此处输入图片说明

第 408,409 页第 29.2 节 Bulletpoint 11 说:

如果在向 MyISAM 表添加行时磁盘空间不足,则不会发生错误。服务器暂停操作,直到空间可用,然后完成操作。

因此,您需要为磁盘上的临时表提供大量空间。我之前提到过这一点(请参阅我的旧帖子“站点离线”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 如何使用内部临时表