雄关漫道真如铁,而今迈步从头越。
全部博文(348)
分类: Mysql/postgreSQL
2017-03-18 20:50:20
当你使用 SHOW GLOBAL STATUS命令检查数据库的健康状况时发现Created_tmp_disk_tables的值一直在增加,那么你就需要关注如下两个数据库参数是否设置恰当了。
1.tmp_table_size
tmp_table_size规定了内部内存临时表的最大值,每个线程都要分配。如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下,默认:
mysql> show variables like "tmpdir";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir | /tmp/ |
+---------------+-------+
优化查询语句的时候,要避免使用临时表,如果实在避免不了的话,要保证这些临时表是存在内存中的。如果需要的话并且你有很多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%
2.max_heap_table_size
这个变量定义了用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。这个变量支持动态改变,
即set @max_heap_table_size=N。但对于已经存在的内存表就没有什么用了,除非这个表被重新创建(create table)或者修改(alter table)或者truncate table。服务重启也会设置已经存在的内存表为全局max_heap_table_size的值。这个变量和tmp_table_size一起限制了内部内存表的大小。