你现在是否需要在MySQL服务器上添加更多的内存吗?如果你接触了MySQL一段时间,你应该知道为了利用系统RAM,系统将不会自动变化。让我们来看一下这些可以调节的系统参数。

InnoDB 参数


innodb_buffer_pool_size


innodb 缓冲池是“InnoDB缓存数据和索引的内存区域”,这个参数很可能是MySQL中最重要的调整参数,如果你的这个参数值太小了,InnoDB必须花费额外的CPU时间及磁盘IO时间,在内存中加载和释放数据页。,而这个时间最好花在执行时间上。

该参数值默认大小为128MB,在任何重要的数据库中都少得可怜。增加这个缓存大小,允许更高频率访问的数据页保留在内存中,以便更快的访问。当然,你不需要使得这个缓存大大超过你的数据集大小,也无需将所有数据加载到缓存中,数据库系统在任何时间的访问所有数据的命中率为100%,是极为罕见的。

下面的仪表板属于PMM 2.0,给了某些观察缓冲池大小的方式。不用做任何事项,我们能看到缓冲池里有多少数据页的百分比大小,还能看到多久一次命中缓存失败,只能去磁盘读取数据。理想的,我们需要这个命中失败比率尽可能的低。

mysql数据库缓存清理 mysql8 缓存_0 读取数据

我们可以在线修改InnoDB的缓冲池大小,并持久化到配置文件:

mysql> SET PERSIST innodb_buffer_pool_size=402653184;

可以在MySQL错误日志中查看InnoDB缓冲池重新分配大小的过程,还可以检查系统状态 innodb_buffer_pool_resize_status 的值。

Innodb_flush_method

这个参数控制了InnoDB怎么样开启及刷新表空间和数据文件。这参数在MySQL上没有直接影响,但依据下面的文件系统调整为合适的值可以缓解内存压力,默认的参数值是"fsync",表示使用缓存IO来管理打开的文件。缓冲IO会导致文件系统内的内存使用及其他低级别的内核操作。


因为InnoDB使用了自己的方式来控制数据安全操作(如redo记录,双写buffer)在文件级缓存/缓冲这些数据是不必要的。我们可以设置该参数为 O_DIRECT, 来控制InnoDB不做额外的缓存。在my.cnf配置文件中修改需要重启MySQL服务。


innodb_numa_interleave


对于巨量内存系统(如大于128GB),建议调整NUMA交叉使用。不用太多描述,开启这个参数控制内存在多个CPU专属内存通道中交叉分配使用。这有助于“平衡”内存分配,以便一个CPU不会成为内存瓶颈。在my.cnf配置文件中修改需要重启MySQL服务。

临时表

MySQL 8.0 改变了临时表的管理。此前,我们使用参数为 tmp_table_size 和 max_heap_table_size,若一个内存中的临时表大小超过了这两个值,MySQL就会把这个临时表转化为磁盘上的临时表。这两个变量控制了每个临时表的基础配置,因此,试过设置这两个参数值为1GB,且并发了50个低效的查询,MySQL可能分配使用50GB额外的内存。

这两个参数一直存在到8.0,并使用 MEMORY 存储引擎来管理临时表。这个新的 MEMORY 存储引擎更有效率,并配置为默认了。

配置参数 temptable_max_ram 控制了所有临时表可以使用的总内存数量,超出内存使用的临时表将转化为磁盘临时表。若服务器来了上述的50个查询,且每个查询会使用256MB内存,而参数 temptable_max_ram 值配置为1GB,则前4个查询创建的临时表存储在内存里,后面46个查询创建的临时表将会在磁盘中。

mysql数据库缓存清理 mysql8 缓存_缓存_02

可以通过调整 参数 temptable_max_ram 值,来观察磁盘上临时表减少的创建数量。


全局buffers


MySQL有很多用于多种方面的小内部缓冲,如线程栈内存,表顺序扫描的read_buffer_size,排序读取的read_rnd_buffer_size,等。这些参数的详细解释可以在下面的博客中看到,特别是还在使用MyISAM存储引擎。

Best Practices for Configuring Optimal MySQL Memory Usage

MySQL每次建立一个连接,该连接将会获取自己的一组缓冲。若明确的限制了最大连接数量,则改变 max_connections 参数时,需要考虑是否有更多的可用内存供连接使用。

考虑到增加参数值 sort_buffer_size 可以提高使用了GROUP BY和 ORDER BY子句,但无法内查询优化器及额外索引优化查询的性能,因此该参数最好基于session回话去改变,而非全局改改变。

若服务器有大量的表,加大参数 table_definition_cache 可以帮助加速打开表。


综述


这篇文章介绍了MySQL 8.0 一些基本的参数,在加大了服务器内存后可以考虑优化,特别要注意,若分配了太多的内存,可能导致不幸的OOM Killer。

最后要提及的参数,是innodb_dedicated_server,配置该值为“ON”可以控制MySQL 4个关键参数 innodb_buffer_pool_sizeinnodb_log_file_sizeinnodb_log_files_in_group, 及 innodb_flush_method。你可以查看手册页,看看MySQL根据你的服务器有多少内存可用而做出的各种截断和计算,这个参数可能是您一直在寻找的“简单按钮”。