简单说明下MySQL的内存使用。
现在大内存机器已经成为互联网公司的标配,对于内存的优化已经不像以前显得那么重要,然而,我们还是有必要了解一些MySQL内存使用的知识,这会让我们的调优更有效果,也避免可能出现的故障,比如OOM。
1、MySQL使用内存一般有两大块,如果你使用MyISAM,需要关注留给索引缓存的内存,参数是Key_buffer_size,如果你使用的InnoDB,需要关注的参数是 innodb_buffer_pool_size,它定义了我们分配给数据库数据缓冲池的内存大小。
对于一些MySQL基于自身管理目的分配的内存,我们并没有什么手段去调整和优化,我们主要优化的是数据操作阶段的内存使用,这方面也是内存的大头所在,我们可以从全局和会话两个级别进行调整。
对于一些全局分配的内存,如key_buffer_size, query_cache_size etc,在系统启动之初,就会完成初始化分配,分配所有内存。对于另外的一些涉及到查询行为的内存参数,比如read_buffer_size, sort_buffer_size, join_buffer_size,MySQL在查询需要的时候才分配这些内存,我们需要留意这些参数不要设置得过大,因为如果真的查询需要使用到这部分内存,而你又拥有大量的连接,那么可能无谓的浪费大量内存。具体的还有许多内存相关的参数,大家可以查询官方文档,具体不再赘述。
2、如果希望内存尽量节省,我们应该尽量基于主键进行检索,要充分利用索引筛选记录和排序记录。
3、一些非核心功能的特性,比如存储过程、分区表,可能导致大量的内存被使用而未释放,而你却很难去调优。
4、我们会观察到,实际MySQL使用的内存会比 innodb_buffer_pool_size 这个参数设置的要大10%左右,当你要设置一个很大的 innodb_buffer_pool_size 的时候,这些额外的元数据管理开销你要留意。
5、建议MyISAM和InnoDB不要混用。
6、许多实践证明,Linux系统默认的内存分配器对于多线程内存分配管理不佳,如果你需要的性能,建议使用 jemalloc 或者 tcmalloc代替之,在核数多于8核的情况下, jemalloc 或者 tcmalloc会表现的出色的多。