mysql maxtmptables_mysql tmp_table_size max_heap_table_siz

博客讨论了MySQL中临时表的使用,特别是在无索引的连接和排序操作中。增大tmp_table_size和max_heap_table_size并不总是提升查询性能,反而可能导致低效查询更依赖磁盘。当内存中的临时表超出限制时,会转存到磁盘,影响查询速度。建议调整join_buffer_size和sort_buffer_size,创建合适索引,以减少临时表的创建,提高整体性能。
摘要由CSDN通过智能技术生成

每当您增加tmp_table_size和max_heap_table_size时,请记住,设置这些值不会使查询表现得更好。 实际上,它使低效率的查询的行为比以前更糟。 什么情况下

当查询执行连接或排序(通过ORDER BY)而没有索引的好处时,必须在内存中形成临时表。 这将增加Created_tmp_tables。

如果临时表增长到tmp_table_size中的字节数并且需要更多空间怎么办? 发生以下事件序列:

查询处理必须停止

在磁盘上创建一个临时表

将基于内存的临时表的内容传输到基于磁盘的临时表中

放入基于内存的临时表

查询处理继续使用基于磁盘的临时表

此过程增加Created_tmp_disk_tables

了解了这些机制,让我们探讨一下每种情况下发生的情况

磁盘表从27.37%下降到21.70%->预期更多

如果之前运行的查询将结果缓存在RAM中,则很容易发生这种情况。 这样就无需从头开始处理查询,而无需重新创建相同的大型临时表。

临时文件从1.16%上升到33.75%->为什么?

这不足为奇。 这仅表明存在需要临时表的查询这一事实。 它们首先在RAM中创建。 这仅表示存在无法很好连接的查询(可能是join_buffer_size太小)或ORDER BY非索引列或具有临时表的列(可能是sort_buffer_size太小)。

内存表从71.48%下降到44.55%->奇怪; 预计会上升

这也不足为奇。 如果对于具有相同值的同一查询有足够的调用,则可以通过执行先前缓存的结果来抢占排序和联接。

建议

鉴于这些情况,可以进行以下调整:

join_buffer_size

sort_buffer_size

创建将要使用的索引通过eq_ref加入

通过索引扫描排序

总体目标应该是尽可能避免创建临时表。 简单地增加tmp_table_size和max_heap_table_size可以使效率低下的查询和缺少正确索引的表正常运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值