2008年1月14日星期一

mysql内存使用与优化-myisam

凌晨,一台mysql(全部是myisam表)出现了内存不足!
Out of memory; restart server and try again (needed 67108856 bytes)

Got error 12 from storage engine

[ERROR] Got error 12 when reading table './****/baby'

很明显,该台mysql关于内存设置偏高,导致mysql请求分配内存失败!特别是每连接独享的内存设置存在问题,当连接数过多时,内存会相当稀缺!而myisam的cache是使用的文件系统本身的cache,所以内存不足将导致性能急剧下降。
先了解对于myisam我们需要调节的几个跟内存相关的参数!
所有连接共享的参数
1 key_buffer_size
这个肯定都知道,索引区大小
2 query_cache_size
查询缓存区大小
每连接独享的参数
3 join_buffer_size
在不使用索引的情况下,用于完全联接的缓冲区的大小!
4 read_buffer_size
读每个表里面连续的一块东西使用的缓存区大小
5 read_rnd_buffer_size
对已经排序了的结果直接读取,避免从disk读取
6 sort_buffer_size
排序空间大小
7 thread_stack
默认的已经足够大192K
8 binlog_cache_size
这个我用的很少,具体见手册
上面每连接独享的参数,一定要注意!如果修改不当,将导致mysql内存不足,偷鸡不成,反赊把米!
基本内存估算就是
全局内存=key_buffer_size+query_cache_size
每连接独享内存=sort_buffer_size+read_buffer_size+read_rnd_buffer_size+join+buffer_size
+上面的7和8(很少用)
所以使用的最大内存=全局内存+每连接独享内存*连接总数(max_connections)

没有评论: