MySQL参数设置最佳实践

会话参数

mysql> set global max_connections=4532;

动态参数。默认值为151。允许的最大同时客户端连接数。mysqld实际上允许 max_connections + 1个客户端连接。保留额外的连接,以供具有特权的帐户使用。

mysql> set global max_user_connections=4000;

动态参数。默认值0表示无限制。任何给定的MySQL用户帐户允许的最大同时连接数。

mysql> set global max_connect_errors=50000;

动态参数。默认值为100。在max_connect_errors没有成功连接的情况下中断了来自主机的连续连接请求后,服务器将阻止该主机进行进一步的连接。

back_log=3000

静态参数。默认值-1表示自动调整大小。MySQL可以拥有的未完成连接请求数。当主MySQL线程在很短的时间内收到很多连接请求时,该back_log值指示在MySQL暂时停止响应新请求之前的短时间内可以堆叠多少个请求。仅当您期望在短时间内有大量连接时,才需要增加此数量。

mysql> set global connect_timeout=10;

动态参数。默认值为10。设定远程用户必须回应PORT类型数据连接的最大时间。

mysql> set global wait_timeout=7200;

动态参数。默认值为28800。服务器在关闭非交互式连接之前等待活动的秒数,类似于jdbc连接。

mysql> set global interactive_timeout=7200;

动态参数。默认值为28800。服务器在关闭交互式连接之前等待活动的秒数,类似于mysql客户端连接。

mysql> set global thread_cache_size=256;

动态参数。默认值-1表示自动调整大小。服务器应缓存多少线程以供重用。当客户端断开连接时,如果那里的thread_cache_size线程少于该线程,则将客户端的线程放入高速缓存中。如果您有许多新连接,则可以增加此变量以提高性能。通过检查Connections和 Threads_created状态变量之间的差异,您可以了解线程缓存的效率。

binglog日志参数

log-bin=mysql-bin

静态参数。指定用于二进制日志文件的基本名称。启用二进制日志记录后,服务器会将所有更改数据的语句记录到二进制日志中,该日志用于备份和复制。在早期的MySQL版本中,默认情况下禁用二进制日志记录。从MySQL8.0开始,无论您是否指定--log-bin选项,默认情况下都会启用二进制日志记录。

mysql> set global binlog_cache_size=131072;

动态参数。默认值为32768。在事务期间,用于保存更改的二进制日志的内存缓冲区的大小。该值必须是4096的倍数。

mysql> set global binlog_error_action=ABORT_SERVER;

动态参数。在MySQL5.7.7之前,默认为IGNORE_ERROR。在MySQL5.7.7及更高版本中,此变量默认为ABORT_SERVER,这使得服务器在遇到二进制日志中的此类错误时会暂停日志记录并关闭服务器。重新启动后,恢复将如服务器意外停止一样继续进行。

mysql> set global binlog_format=ROW;

动态参数。在MySQL5.7.7之前,默认格式为STATEMENT。在MySQL5.7.7和更高版本中,默认值为ROW。

mysql> set global server_id=1;

动态参数。在MySQL8.0之前,默认值为0。在MySQL8.0中,默认值为1。此变量指定服务器ID。在MySQL5.7中,server_id如果启用了二进制日志记录,则必须指定,否则将不允许服务器启动。

mysql> set global gtid_mode=on;
mysql> set global enforce_gtid_consistency=on;

动态参数。gtid_executed控制是否启用基于GTID的日志记录以及日志可以包含的事务类型。enforce_gtid_consistency服务器通过仅允许执行可以使用GTID安全记录的语句来实现GTID一致性。

mysql> set global expire_logs_days=30;

动态参数。默认值0表示不自动删除。指定自动删除二进制日志文件之前的天数。

mysql> set global max_binlog_cache_size=18446744073709547520;

动态参数。默认值为18446744073709547520。如果事务需要的内存超过这个字节数,服务器将生成一个多语句事务,该事务需要的存储空间超过max_binlog_cache_size字节数。

mysql> set global max_binlog_size=524288000;

动态参数。默认值为1073741824。如果写入二进制日志导致当前日志文件大小超过此变量的值,则服务器将旋转二进制日志(关闭当前文件并打开下一个日志文件)。事务以一个块的形式写入二进制日志,因此永远不会在多个二进制日志之间进行拆分。因此,如果您的交易量很大,您可能会看到二进制日志文件大于max_binlog_size。

mysql> set global sync_binlog=1;

动态参数。在MySQL5.7之前,默认值为0。在MySQL5.7之后,默认值为1。控制MySQL服务器将二进制日志同步到磁盘的频率。sync_binlog=0:禁用MySQL服务器将二进制日志同步到磁盘的功能,此设置可提供最佳性能。sync_binlog=1:在提交事务之前启用二进制日志到磁盘的同步,这是最安全的设置。sync_binlog=N可能会对性能产生负面影响,较高的值可以提高性能,但会增加数据丢失的风险。

慢日志参数

mysql> set global slow_query_log=0;

动态参数。默认值为OFF。是否启用慢速查询日志。日志输出的目的地由log_output系统变量控制。可根据业务需求开启慢查询日志,查看较慢的SQL语句。

mysql> set global long_query_time=1;

动态参数。默认值为10。如果查询所花的时间超过许多秒,则服务器将增加Slow_queries状态变量。如果启用了慢查询日志,则查询将记录到慢查询日志文件中。

mysql> set global log_output=FILE;

动态参数。默认值为FILE。常规查询日志和慢速查询日志输出的一个或多个目标。值是从TABLE, FILE, and NONE中选择的一个或多个逗号分隔的单词的列表。表选择记录到mysql系统模式中的 general_log和slow_log。FILE选择记录日志文件。

mysql> set global log_queries_not_using_indexes=OFF;

动态参数。默认值为OFF。如果在启用慢查询日志的情况下启用此变量,则会记录预期将检索所有行的查询。

Redo日志参数

innodb_log_file_size=1048576000

静态参数。默认值为50331648。日志组中每个日志文件的字节大小。通常,日志文件的组合大小应该足够大,以便服务器能够消除工作负载活动的高峰和低谷,这通常意味着有足够的重做日志空间来处理一个多小时的写活动。值越大,缓冲池中所需的检查点刷新活动就越少,从而节省磁盘I/O。日志文件越大,崩溃恢复速度也越慢。

innodb_log_files_in_group=3

静态参数。默认值为2。日志组中的日志文件数。InnoDB以循环方式写入文件。默认(推荐)值为2。如果不指定任何InnoDB日志变量,默认的是创建两个文件ib_logfile0和ib_logfile1在MySQL数据目录。

缓存参数

缓存参数参考应基于当前内存设置。

mysql> set global sort_buffer_size=720896;

动态参数。默认值为262144。每个必须执行排序的会话都会分配一个此大小的缓冲区,通常用于优化。sort_buffer_size值至少必须足够大,以容纳排序缓冲区中的15个元组。

mysql> set global read_buffer_size=720896;

动态参数。默认值为131072。对MyISAM表进行顺序扫描的每个线程都会为其扫描的每个表分配此大小的缓冲区。如果进行多次顺序扫描,则可能需要增加此值。

mysql> set global read_rnd_buffer_size=360448;

动态参数。默认值为262144。此变量用于从MyISAM表读取,并且对于任何存储引擎,用于多范围读取优化。当MyISAM在键排序操作之后按排序顺序从表中读取行时,将通过此缓冲区读取行以避免磁盘查找。将变量设置为较大的值可以大大提高ORDER BY性能。

mysql> set global join_buffer_size=360448;

动态参数。默认值为262144。用于普通索引扫描,范围索引扫描和不使用索引的联接的缓冲区的最小大小,从而执行全表扫描。

mysql> set global net_buffer_length=16384;

动态参数。默认值为16384。通常不应该更改此变量,但是如果您的内存很少,则可以将其设置为客户端发送的语句的预期长度。如果语句超过此长度,连接缓冲区将自动扩大。

mysql> set global max_allowed_packet=1073741824;

动态参数。在MySQL8.0之前,默认值为4194304。在MySQL8.0中,默认值为67108864。如果使用大BLOB列或长字符串,则必须增加此值。它应该和BLOB要使用的最大大小一样大。通过更改max_allowed_packet变量的值来更改消息缓冲区的大小时,如果客户端程序允许,还应该在客户端上更改缓冲区的大小。max_allowed_packet客户端库中内置的默认值为1GB,但是单个客户端程序可能会覆盖此值。

mysql> set global bulk_insert_buffer_size=8388608;

动态参数。默认值为8388608。MyISAM使用一种特殊的树状缓存,使批量插入更快。将数据添加到非空表时。此变量限制高速缓存树的大小。将其设置为0将禁用此优化。默认值为8MB。

mysql> set global max_heap_table_size=16777216;

动态参数。默认值为16777216。此变量设置MEMORY允许用户创建的表增长的最大大小。还与tmp_table_size一起使用以限制内部内存表的大小。

mysql> set global tmp_table_size=2097152;

动态参数。默认值为16777216。如果您执行许多高级分组查询并且内存很大,请增加tmp_table_size的值(如果需要,还可以增加max_heap_table_size)。

mysql> set global key_buffer_size=8388608;

动态参数。默认值为8388608。MyISAM表的索引块被缓冲并由所有线程共享。key_buffer_size是用于索引块的缓冲区的大小。密钥缓冲区也称为密钥缓存。您可以增加该值,以便对所有读取和多次写入获得更好的索引处理。在主要功能是使用以下命令运行MySQL的系统上MyISAM存储引擎中,此变量可接受的值为计算机总内存的25%。但是,您应该意识到,如果将该值设置得太大(例如,超过计算机总内存的50%),则系统可能会开始分页并变得非常慢。

mysql> set global key_cache_block_size=1024;

动态参数。默认值为1024。密钥高速缓存中块的大小(以字节为单位)。默认值为1024。

innodb参数

innodb_buffer_pool_instances=8

静态参数。默认值为8。如果innodb_buffer_pool_size<1GB,默认值为1。InnoDB缓冲池划分的区域数。对于缓冲池在千兆字节范围内的系统,将缓冲池划分为单独的实例可以减少不同线程对缓存页的读写时的争用,从而提高并发性。此选项仅在设置innodb_buffer_pool_size为1GB或更大时才生效。总缓冲池大小在所有缓冲池之间分配。为了获得最佳效率,指定的组合 innodb_buffer_pool_instances 和innodb_buffer_pool_size,使得每个缓冲池实例是至少为1GB。

mysql> set global innodb_buffer_pool_size=134217728;

在MySQL5.7之前,为静态参数。在MySQL5.7之后,为动态参数。默认值为134217728(128MB)。缓冲池(用于InnoDB缓存表和索引数据的内存区域)的大小(以字节为单位)。最大值取决于CPU架构。较大的缓冲池需要较少的磁盘I/O才能多次访问同一表数据。您可以将缓冲池大小设置为计算机物理内存大小的50%-80%。

innodb_data_file_path=ibdata1:200M:autoextend

静态参数。默认值为ibdata1:12M:autoextend。定义InnoDB系统表空间数据文件的名称,大小和属性。

mysql> set global innodb_file_per_table=ON;

动态参数。默认值为ON。当innodb_file_per_table启用时,在文件的每个表的表空间默认创建的表。禁用后,默认情况下在系统表空间中创建表。

mysql> set global innodb_flush_log_at_timeout=1;

动态参数。默认值为1。写入或刷新日志的时间间隔。

mysql> set global innodb_flush_log_at_trx_commit=1;

动态参数。默认值为1。当提交相关的I/O操作被批量重新排列时,这个参数控制提交操作的ACID一致性和高性能之间的平衡。可以改变这个参数的默认值来提升数据库的性能,但是在数据库宕机的时候会丢失少量的事务。要完全符合ACID,必须使用默认设置1。日志在每次事务提交时写入并刷新到磁盘。设置为0时,每秒写入一次日志并将其刷新到磁盘。尚未刷新日志的事务可能会在崩溃中丢失。设置为2时,将在每次事务提交后写入日志,并每秒刷新一次到磁盘。尚未刷新日志的事务可能会在崩溃中丢失。对于设置0和2,不能保证每秒刷新一次100%。

innodb_flush_method=unbuffered

静态参数。MySQL8.0之前,默认值为NULL。MySQL8.0中,默认值为unbuffered。指定刷新数据到InnoDB数据文件和日志文件的方法,刷新方法会对I/O有影响。unbuffered或0:InnoDB使用模拟异步I / O和非缓冲I / O。normal或1: InnoDB使用模拟的异步I / O和缓冲的I / O。

innodb_log_buffer_size=16777216

静态参数。在MySQL5.7之前,默认值为8388608。在MySQL5.7之后,默认值为16777216。InnoDB用于写入磁盘上的日志文件的缓冲区的大小(以字节为单位)。较大的日志缓冲区使大型事务可以运行,而无需在事务提交之前将日志写入磁盘。因此,如果您有更新,插入或删除许多行的事务,则使日志缓冲区更大可以节省磁盘I/O。

mysql> set global innodb_max_dirty_pages_pct=75;

动态参数。MySQL8.0之前,默认值为75。MySQL8.0中,默认值为90。当Innodb缓存池中脏页所占的百分比达到这个参数的值时,InnoDB会从缓存中向磁盘写入数据。

innodb_open_files=3000

静态参数。默认值-1表示自动调整大小。仅当您使用多个InnoDB表空间时,此变量才有意义。它指定MySQL一次可以保持打开状态的最大.ibd文件数。

数据库参数

mysql> set global transaction-isolation=READ-COMMITTED;

设置默认的事务隔离级别。该 level值可以是 READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ,或 SERIALIZABLE。

mysql> set global character_set_server=utf8mb4;

服务器默认字符集。

mysql> set global query_cache_size=0;

分配用于缓存查询结果的内存量。默认情况下,查询缓存处于禁用状态。

mysql> set global query_cache_type=OFF;

设置查询缓存类型。设置该 GLOBAL值可设置此后连接的所有客户端的类型。各个客户端可以设置该 SESSION值以影响自己对查询缓存的使用。此变量默认为OFF。如果服务器在query_cache_type设置为0的情况下启动 ,则它根本不会获取查询缓存互斥量,这意味着无法在运行时启用查询缓存,并且减少了查询执行的开销。

default_time_zone='+8:00'

设置默认服务器时区。此选项设置全局 time_zone系统变量。如果未指定此选项,则默认时区与系统时区相同(由system_time_zone系统变量的值决定) 。

mysql> set global log_timestamps=SYSTEM;

此变量控制写入错误日志的消息以及通常写入文件的查询日志和慢速查询日志消息中时间戳的时区。它不影响一般的查询日志和写入表。允许的log_timestamps 值为UTC(默认值)和 SYSTEM(本地系统时区)。

lower_case_table_names=1

如果设置为0,表名将按指定存储,并且比较区分大小写。如果设置为1,则表名在磁盘上以小写形式存储,并且比较不区分大小写。如果设置为2,则表名按给定存储,但以小写形式进行比较。此选项也适用于数据库名称和表别名。

附录

[mysqld]
port=3306
basedir=D:\mysql
datadir=D:\mydata\data     #与安装时创建的目录一致
log_error=D:\mydata\data\myerror.err
#会话参数
max_connections=4532
max_user_connections=4000
max_connect_errors=50000
wait_timeout=7200
interactive_timeout=7200
thread_cache_size=256
#binlog日志参数
log-bin=mysql-bin
binlog_cache_size=131072
binlog_error_action=ABORT_SERVER
binlog_format=ROW
server_id=1
gtid_mode=on
enforce_gtid_consistency=on
expire_logs_days=30
sync_binlog=1
#慢日志参数
slow_query_log=0
long_query_time=1
log_output=FILE
#Redo日志参数
innodb_log_file_size=1048576000
innodb_log_files_in_group=3
#缓存参数
sort_buffer_size=720896
read_buffer_size=720896
read_rnd_buffer_size=360448
join_buffer_size=360448
max_allowed_packet=1073741824
max_heap_table_size=16777216
tmp_table_size=2097152
#innodb参数
innodb_buffer_pool_size=134217728   #改为内存的50%-80%
innodb_data_file_path=ibdata1:200M:autoextend 
innodb_file_per_table=ON
innodb_log_buffer_size=16777216
#事务隔离级别
transaction-isolation=READ-COMMITTED
#字符集
character_set_server=utf8mb4
#查询缓存
query_cache_size=0
query_cache_type=OFF
#设置时区
default_time_zone='+8:00'
log_timestamps=SYSTEM
#大小写不敏感
lower_case_table_names=1


请使用浏览器的分享功能分享到微信等