MySQL内存优化
内存是影响数据库性能的重要资源,也是MySQL性能优化的重要方向。
内存优化原则
- 将尽量多的内存分配给MySQL做缓存,但是要给操作系统和其他程序的运行预留足够的内存,否则如果产生SWAP页交换,将严重影响性能
- MyISAM的数据文件读取依赖于操作系统自身的IO缓存,因此,如果有MyISAM表,就要预留更多的内存给操作系统
- 排序区、连接区等缓存是分配给每个数据库会话专用的,其默认值的设定要根据最大连接数合理分配,如果设置太大,不但浪费内存资源,而且在并发连接较高时会导致物理内存耗尽。
InnoDB内存优化
调整用户服务线程排序缓存区
- 如果通过
show global status
看到sort_merge_passes
的值很大,可以考虑通过调整参数sort_buffer_size
的值来增大排序缓存区,以改善带有order by
子句或group
子句SQl的性能。 - 对于无法通过索引进行连接操作的查询,可以尝试通过增大
join_buffer_size
的值来改善性能。 - 需要注意的是,
sort buffer
和join buffer
都是面向客户服务线程分配的,如果设置过大,可能会导致内存交换。尤其是join buffer,如果是多表关联的复杂查询,还可能会分配多个join buffer。因此,最好的策略是设置较小的全局joinbuffersize,而对需要做复杂连接操作的session单独设置较大的joinbuffersize。