漫漫长路,其修远兮!
分类: Mysql/postgreSQL
2013-03-04 16:04:06
1.几个动态修改的变量
key_buffer_size:键缓冲区大小,只在实际使用的时候才分配空间,主要是mysisam引擎使用
table_cache_size/table_open_cache:设置不会马上生效,要等到下一个线程打开表时才会生效,表缓存的数量
可以配合status中的open_tables和opend_talbes,如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了
在 MySQL5.1.3之前的版本通过 table_cache 参数设置,但从MySQL5.1.3开始改为 table_open_cache 来设置其大小
tmp_table_size :
它规定了内部内存临时表的最大值,每个线程都要分配。(实际起限制作用的是tmp_table_size和max_heap_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%
max_heap_table_size:
这个变量定义了用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。这个变量支持动态改变,即set @max_heap_table_size=#
,但是对于已经存在的内存表就没有什么用了,除非这个表被重新创建(create table)或者修改(alter table)或者truncate table。服务重启也会设置已经存在的内存表为全局max_heap_table_size的值。
这个变量和tmp_table_size一起限制了内部内存表的大小。
tmp_table_size 和 max_heap_table_size 大小要一致, 且不能分配过大, 建议不超过 128MB
当另一个系统参数 max_heap_table_size 的大小还小于 tmp_table_size 的时候,MySQL 将使用 max_heap_table_size 参数所设置大小作为最大的内存临时表大小,而忽略 tmp_table_size 所设置的值。而且 tmp_table_size 参数从 MySQL 5.1.2 才开始有,之前一直使用 max_heap_table_size
max_tmp_tables:
客户端可以同时打开的临时表的最大数
mysql内存使用的情况
主要是public+private*connections
public主要包括:key_buffer_size, innodb_buffer_pool_size, innodb_additional_memory_pool_size, innodb_log_buffer_size, query_cache_size
private主要包括:read_buffer_size, sort_buffer_size,join_buffer_size, read_rnd_buffer_size, tmp_table_size
如果这些变量设置的太高,很容易引发诸多问题:耗尽内存,使用swap,耗尽地址空间