开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,(共1700人左右 1 + 2 + 3 + 4) 3群突破 490已关闭自由申请如需加入请提前说明,新人会进4群(210+)准备开5群,另欢迎 OpenGauss 的技术人员加入。
最近人员变动,群主需要重新梳理一下MySQL的配置参数,方便后续的工作与标准化,没有小弟做了,自己就的上阵了。实话实说,最近一直忽视了MySQL所以有些知识的在从新拾起来。
鉴于MySQL 8 的一些参数的确由于版本的变动有很多变化,所以进行梳理。
1 cache 与 buffer 类
join_buffer_size
key_buffer_size
metadata_locks_cache_size
open_files_limit
schema_definition_cache
table_definition_cache
table_open_cache
table_open_cache_instances
thread_cache_size
sort_buffer_size
select_into_buffer_size
read_buffer_size
read_rnd_buffer_size
preload_buffer_size
bulk_insert_buffer_size
innodb_buffer_pool_instances
innodb_buffer_pool_size
这个类型里面主要分成 MySQL 和 Innodb 的关于cache 或buffer有关的参数,下面逐一进行梳理
1 innodb buffer pool instances 这个参数实际上与你的内存与CPU 有关,本身这个参数用于指定缓冲池的数量,在具有多CPU和大量内存的情况下,为提供更好的并发性的情况下,将此设置为更多的数量有助于更好的利用多CPU操控缓冲池的问题。一般可以简单的认为这部分为 CPU的数量 - 2 。
2 innodb buffer pool size 这个参数实际上与你的内存在innodb buffer pool上的内存分配有关,基于数据库数据要加载到内存中处理的方式,这部分一般为整体物理内存的 65% - 70%。
3 join buffer size 这个参数的设置是针对数据在处理表连接情况下使用的缓冲区,在多表连接中存储使用到的表的数据缓冲在join buffer中提高多表数据处理中性能,减少物理磁盘空间驻留表数据的情况,默认这部分256KB,但基于一些MySQL 在承担一些OLAP 或程序开发不力导致的多表关联的情况,这里可以将这部分设置的更大一些比如 2MB 4MB。
4 key buffer size 这个参数比较特殊,他需要以4096的倍数进行增长,但基于MyISAM引擎的核心参数在MySQL8 中这个参数可以忽略了,但基于Mysql 8 一下的版本,基于系统表还是基于MyISAM数据库引擎的,基本以默认值即可。
5 sort_buffer_size 这个参数是指定MySQL中的排序操作的缓冲区,主要在语句中出现ORDER BY 的语句来对搜取的数据进行缓存中的排序。默认大小256KB, 若大量的语句中都包含排序,和分页等部分,sort_buffer_size 可以考虑设置的大一些,提高类似语句的处理速度。
6 select_into_buffer_size 这个参数是在8.022 里面引入的,他提出的意义在于解决select into outfile , select into dumpfile 的数据导出中的问题,他解决了在快速写入数据中对于磁盘的消耗过多的问题,而将数据先驻留在磁盘缓冲中,在一次性的写入到磁盘中。同时他还替代了 read_buffer_size,也就是说在8.022 后的版本可以通过设置select_into_buffer_size 来替换read_buffer_size 的值。
7 read_buffer_size 这个参数在表中进行顺序扫描中定义为这个访问分配的表的缓冲大小,在进行大量顺序扫描的情况下,增加这个值有利于你的数据读取的速度。在实际的设置中他比 read_rnd_buffer_size的设置要小,基本为其的一半。如果经常进行数据导出或经常做一些顺序性的数据读取量大的业务,则可以调整此参数大一些。
8 read_rnd_buffer_size 这个参数与上面的参数最大的不同是服务的数据扫描方式不同,这里他们使用的是随机扫描,在进行一些非顺序扫描的方式中使用缓存来缓冲数据,如果在查询中多是通过主键查询的方式来获取数据可以提高这部分的缓存。
9 preload_buffer_size 这个参数主要控制顺序读取缓冲区大小,顺序读取是指以连续的顺序读取磁盘的数据库快,提高读取的性能。通常在提高大量连续读取磁盘的业务中,提高preload_buffer_size 有助于提高读取的效率。(在官网文档说明较少)
10 bulk_insert_buffer_size 这个参数主要控制MySQL 的数据插入缓冲区,经常批量导入数据的MYSQL 提高此值可以提高数据插入数据库的速度。默认值8MB,如果经常大批量的导入数据可以提高此值。
11 metadata_locks_cache_size 这个参数很少被提到,这个参数主要是提高metadata_locks_cache_size 决定了内存中维护元数据锁的数量,当发生元数据改变的时候,MySQL尝试获取元数据锁来组织其他对该元数据的操作,保证数据的一致性,提高这个值可以提高并发操作获取元数据锁的效率,减少锁的征用和等待,默认这个值为1024
12 open_files_limit 这个参数对于MySQL非常重要,他限制了服务器可以同时打开的文件数量,这里MySQL 每个SQL都会打开表文件,除此以为临时表文件,日志文件,所以这个值尽量设置的大一些,一般为MySQL 最大的链接* 2 ,但实际上有一些繁忙的系统这个值是还是不够,比如一个SQL可能关联了 5张表,这时就需要至少打开5个表文件。32768
13 table_definition_cache 主要是维护Mysql 表定义的缓存数量,较大的值可以提高对于表定义的缓存命中率,加快表的访问速度MySQL以下默认值400, 8.0 默认为2000 (32768)
14 table_open_cache 这个参数主要的目标是在打开表后将表的元数据部分进行缓存,避免频繁打开和关闭表引起的性能问题,通过缓存,在用到的时候,直接通过缓存里面的数据来进行表的操作,更大的cache 有助于一些大表的打开速度提高。
15 thread_cache_size (256)
在MySQL 处理客户请求的时候,会为客户创建一个新的连接来处理客户的请求,创建和销毁线程都是一项昂贵的操作,会消耗大量的系统资源和时间,thread_cache_size 决定了MySQL在内存中维护线程缓存的数量,较大值可以提高链接处理的速度,使得mysql不需要频繁的创建和销毁线程,在5.7 下默认值为0 , 在MYSQL 8.0 默认值为 9
16 schema_definition_cache
用于控制缓存存储在内存中的数据对象的元数据定义的信息存储,包含库,表,索引,列定义。在 MySQL中要访问这些数据库对象元数据定义信息时,MySQL会从磁盘加载这些信息,然后存储在内存中查询使用,schema_definition_cache 就是来存储这些信息的缓存默认2为 256 对于一些表数量多,字段多的数据库,提高这个值有利于对于表的统计信息的获取和处理。
join_buffer_size 2MB
key_buffer_size 默认值
metadata_locks_cache_size 默认值 1024
open_files_limit 655350
schema_definition_cache 256
table_definition_cache 32768
table_open_cache 32768
table_open_cache_instances 16
thread_cache_size 256
sort_buffer_size 2MB
select_into_buffer_size 1MB (8.022 替换 read_buffer_size)
read_buffer_size 1MB
read_rnd_buffer_size 1MB
preload_buffer_size 32768
bulk_insert_buffer_size 32768
innodb_buffer_pool_instances 根据CPU有关
innodb_buffer_pool_size 75%