MySQL OCP888题解066-sort_buffer_size和tmp_table_size

1、原题

1.1、英文原题

You have config file for a running DB with this excerpt:

A、Global variables are not persistent across server restarts.
B、Session variables are not persistent across server restart.
C、The query benefited from sort_buffer_size and tmp_table_size increases.
D、sort_buffer_size should match tmp_table_size to be optimal.
E、The query benefited from tmp_table_size increase.

1.2、答案

A、B、C

2、题目解析

2.1、题干解析

本题主要考察sort_buffer_size和tmp_table_size这两个系统变量。

2.2、选项解析

  1. 在客户端里设置的系统变量,无论是全局的还是会话级别的,重启后都会丢失,所以选项A和B正确。

3、知识点

3.1、知识点1:tmp_table_size系统变量

  • tmp_table_size系统变量代表内存中临时表的最大尺寸,这个变量不适用于用户创建的MEMORY表。对于内存中临时表的尺寸的实际限制是tmp_table_size和max_heap_table_size中较小的一个。当内存中的临时表超过限制时,MySQL自动将其转换为磁盘上的临时表。
  • 如果你做许多高级GROUP BY查询,并且你有大量的内存,请增加tmp_table_size的值(如果有必要,也增加max_heap_table_size)。
  • 你可以通过比较Created_tmp_disk_tables和Created_tmp_tables的值来比较创建的内部磁盘临时表的数量和创建的内部临时表总数。

官方参考文档

3.2、知识点2:在MySQL中使用内部临时表

服务器在以下情况下会创建临时表:

  • UNION语句。
  • 一些视图,比如那些使用TEMPTABLE算法、UNION或者聚合的视图。
  • 派生表。
  • 为子查询或半连接物化而创建的表。
  • 包含ORDER BY子句和不同GROUP BY子句的语句,或者ORDER BY或GROUP BY包含来自连接队列中第一个表以外的表的列。
  • DISTINCT与ORDER BY的组合可能需要一个临时表。
  • 从同一表中选择并插入到同一表中的INSERT … SELECT语句,MySQL创建一个内部临时表来保存来自SELECT的行,然后将这些行插入到目标表中。
  • 多表UPDATE语句。
  • GROUP_CONCAT()或COUNT(DISTINCT)表达式。

要确定一个语句是否需要一个临时表,可以使用EXPLAIN并检查Extra列,看它是否写着使用临时表。但对于派生或物化的临时表,EXPLAIN不一定说使用临时表。

一些查询条件阻止了内存中临时表的使用,在这种情况下,服务器会使用一个磁盘上的表来代替。

  • 表中存在一个BLOB或TEXT列。
  • 如果使用UNION或UNION ALL,且在SELECT列表中存在任何最大长度大于512的字符串列(二进制字符串为字节,非二进制字符串为字符)。

内部临时表存储引擎

  • 内存临时表的引擎是MEMORY存储,磁盘临时表的引擎可以是InnoDB或MyISAM存储引擎。
  • 如果一个内存内部临时表太大,MySQL会自动将其转换为磁盘临时表。内存中临时表的最大尺寸由tmp_table_size或max_heap_table_size值定义,以较小者为准。这与用CREATE TABLE明确创建的MEMORY表不同。对于这样的表,只有max_heap_table_size变量决定了一个表可以增长到多大,而且不需要转换为磁盘格式。
  • internal_tmp_disk_storage_engine变量定义了服务器用来管理磁盘上内部临时表的存储引擎。允许的值是INNODB(默认)和MYISAM。
  • 当使用internal_tmp_disk_storage_engine=INNODB时,生成磁盘上内部临时表的查询如果超过InnoDB的行或列限制,会返回行大小过大或列数过多的错误。解决方法是将 internal_tmp_disk_storage_engine 设置为 MYISAM。
  • 当在内存或磁盘上创建一个内部临时表时,服务器会增加Created_tmp_tables的值。当内部临时表在磁盘上被创建时,服务器会增加Created_tmp_disk_tables的值。如果在磁盘上创建了太多的内部临时表,可以考虑增加tmp_table_size和max_heap_table_size设置。

官方参考文档

4、总结

  1. MySQL会在使用UNION、GROUP、ORDER、SELECT…INSERT等情况下使用内存中的临时表存储数据,内存中临时表的尺寸限制为tmp_table_size和max_heap_table_size两个变量中间的较小值。当内存中的临时表超过此限制时,MySQL自动将其转换为磁盘上的临时表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值