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 的大小以具有相同的值?
那会有帮助吗?
您将tmp_table_size设置为 16G,将max_heap_table_size设置为 8G。太大了!!!
如果您有超过 8G 的临时表,您可以执行三 (3) 件事之一
使用较小的值。将tmp_table_size和max_heap_table_size设置为 16K。这样,临时表将更快地进入磁盘。BTW 是的,它们应该是相同的值。如果您不将这些设置小,则会发生以下情况:
注意:您可能需要将基于磁盘的临时表映射到单独的磁盘。您可以使用tmpdir将所有此类临时表指向该指定卷。我要提醒您注意这一点的原因是什么?
第 408,409 页第 29.2 节 Bulletpoint 11 说:
如果在向 MyISAM 表添加行时磁盘空间不足,则不会发生错误。服务器暂停操作,直到空间可用,然后完成操作。
因此,您需要为磁盘上的临时表提供大量空间。我之前提到过这一点(请参阅我的旧帖子“站点离线”MySQL 服务器无法启动和停止)
调整其他每个连接的设置。如果您设置join_buffer_size和sort_buffer_size,这可以更好地改变查询的执行计划。
调整您的查询。如果您可以更改查询以利用索引或创建将支持您拥有的查询的索引,您可以更快地生成临时表,如果可能,生成更小。
你最初问
我们是否应该调整 tmp_table_size 和 max_heap_table_size 的大小以具有相同的值?
不必要。一起使用时,max_heap_table_size对卸载到磁盘之前可以有多大和内存中的临时表设置上限。唯一的例外是当使用创建表时,CREATE TABLE ... ENGINE=MEMORY;
有关这方面的更多信息,请阅读 MySQL 文档关于MySQL 如何使用内部临时表
归档时间: |
|
查看次数: |
8548 次 |
最近记录: |