tmp_table_size
它规定了内部内存临时表的最大值,每个线程都要分配。(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值。)
如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表
mysql> show variables like "tmpdir";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir | /tmp |
+---------------+-------+
1 row in set (0.00 sec)
查看设置的大小
mysql> show variables like '%table_size';
+---------------------+---------+
| Variable_name | Value |
+---------------------+---------+
| max_heap_table_size | 2097152 |
| tmp_table_size | 2097152 |
+---------------------+---------+
2 rows in set (0.00 sec)
优化查询语句的时候,要避免使用临时表,如果实在避免不了的话,要保证这些临时表是存在内存中的,
如果需要的话并且有很多group by语句,并且有很多内存,增大tmp_table_size(和max_heap_table_size)的值。这个变量不适用与用户创建的内存表(memory table).
可以比较内部基于磁盘的临时表的总数和创建在内存中的临时表的总数(Created_tmp_disk_tables和Created_tmp_tables)
比较好的比例关系是: Created_tmp_disk_tables/Created_tmp_tables < 5%
mysql> show global status like 'created_tmp%'; # 查看临时表使用的情况
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 55565 | # 如果是在磁盘上创建临时表,Created_tmp_disk_tables也增加
| Created_tmp_files | 6 | # 表示MySQL服务创建的临时文件文件数,我测试的创建一张表也会 +1
| Created_tmp_tables | 66253 | # 每次创建临时表,Created_tmp_tables增加
+-------------------------+-------+
max_heap_table_size
这个变量定义了用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。
这个变量支持动态改变,即set @max_heap_table_size=#
但是对于已经存在的内存表就没有用了,除非这个表被重新创建(create table)或修改(alter table)或truncate table
服务重启也会设置已经存在的内存表为全局max_heap_table_size的值。
这个变量和tmp_table_size一起限制了内部内存表的大小。