#MariaDB/MySQL的默认设置性能非常差,仅仅起一个功能测试的作用,不能用在生产环境中,因此要对一些参数进行调整优化
#MySQL/MariaDB 配置文件位于 /etc/my.cnf。 每次更改此文件后你需要重启 MySQL 服务,以使更改生效

The following options will be passed to all MySQL clients

#[client]表示客户端配置,[mysqld]是服务端配置
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock

Here follows entries for some specific programs

The MySQL server

[mysqld]
port = 3306
socket = /opt/jdlserver_prd/mysqldata/mysql.sock
#socket = /tmp/mysql.sock
skip-external-locking
event_scheduler=on

#InnoDB 提供了更灵活的方式,它把每个数据库的信息保存在一个 .ibd 数据文件中。
#每个 .idb 文件代表它自己的表空间。通过这样的方式可以更快地完成类似 “TRUNCATE” 的数据库操作,当删除或截断一个数据库表时,你也可以回收未使用的空间。
#这样配置的另一个好处是你可以将某些数据库表放在一个单独的存储设备。这可以大大提升你磁盘的 I/O 负载。
innodb_file_per_table=1

#MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中
#当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。
#默认值64,假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);
#当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上。
table_open_cache = 64

read_buffer_size = 256K
read_rnd_buffer_size = 512K

lower_case_table_names=1
group_concat_max_len=2000000

要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。

back_log 值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。试图设定back_log高于你的操作系统的限制将是无效的

back_log = 500

#该参数用来设置最大连接数,告诉你当前你的服务器允许多少并发连接。
#默认为100,一般设置为512-1000即可。请记住,太多的连接会导致内存的使用量过高并且会锁住你的 MySQL 服务器。
#一般小网站需要 100-200 的连接数,而较大可能需要 500-800 甚至更多。这里的值很大程度上取决于你 MySQL/MariaDB 的使用情况。

MySQL 服务所允许的同时会话数的上限

其中一个连接将被SUPER权限保留作为管理员登录.

即便已经达到了连接数的上限.

max_connections = 5000

1个小时关闭sleep的连接

wait_timeout=3600

#如果有时网络抽风,或者应用配置错误,或者其他原因导致客户端短时间内不断的尝试连接,客户端可能会被列入黑名单,然后将无法连接,直到再次刷新主机缓存。
#这个选项默认值太小了,可以考虑设的足够大(如果你的服务器配置够强大的话)。

每个客户端连接最大的错误允许数量,如果达到了此限制.

这个客户端将会被MySQL服务阻止直到执行了”FLUSH HOSTS” 或者服务重启

非法的密码以及其他在链接时的错误会增加此值.

查看 “Aborted_connects” 状态来获取全局计数器.

max_connect_errors = 30

所有线程所打开表的数量.

增加此值就增加了mysqld所需要的文件描述符的数量

这样你需要确认在[mysqld_safe]中 “open-files-limit” 变量设置打开文件数量允许至少4096

table_cache = 4096

#允许最大接收数据包的大小,防止服务器发送过大的数据包。可以设置为16MB或者更大,但设置的太大也可能有危险。

服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)

每个连接独立的大小.大小动态增加

max_allowed_packet = 64M

#包消息缓冲区初始化为net_buffer_length字节,但需要时可以增长到max_allowed_packet字节。
net_buffer_length = 8K

在一个事务中binlog为了记录SQL状态所持有的cache大小

如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能.

所有从事务来的状态都将被缓冲在binlog缓冲中然后在提交后一次性写入到binlog中

如果事务比此值大, 会使用磁盘上的临时文件来替代.

此缓冲在每个连接的事务第一次更新状态时被创建

binlog_cache_size = 4M

独立的内存表所允许的最大容量.

此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.

max_heap_table_size = 128M
#在表进行order by和group by排序操作时,由于排序的字段没有索引,会出现Using filesort
#为了提高性能,可用此参数增加每个线程分配的缓冲区大小。默认为256KB
#这个参数不要设置过大,一般在128~256KB即可。另外,一般出现Using filesort的时候,要通过增加索引来解决。

排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序

如果排序后的数据无法放入排序缓冲,

一个用来替代的基于磁盘的合并分类会被使用

查看 “Sort_merge_passes” 状态变量.

在排序发生时由每个线程分配

#sort_buffer_size = 16M

此缓冲被使用来优化全联合(full JOINs 不带索引的联合).

类似的联合在极大多数情况下有非常糟糕的性能表现,

但是将此值设大能够减轻性能影响.

通过 “Select_full_join” 状态变量查看全联合的数量

当全联合发生时,在每个线程中分配

#join_buffer_size = 16M

#线程池,线程缓存。用来缓存空闲的线程,以至于不被销毁
#如果线程缓存在的空闲线程,需要重新建立新连接,则会优先调用线程池中的缓存,很快就能响应连接请求。
#每建立一个连接,都需要一个线程与之匹配。

我们在cache中保留多少线程用于重用

当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,

则客户端线程被放入cache中.

这可以在你需要大量新连接的时候极大的减少线程创建的开销

(一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)

thread_cache_size = 16

此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.

此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris).

你可可以尝试使用 [CPU数量]*(2..4) 来作为thread_concurrency的值

thread_concurrency = 16

#缓存select语句和结果集大小的参数。查询缓存会存储一个select查询的文本与被传送到客户端的相应结果。
#如果之后接收到一个相同的查询,服务器会从查询缓存中检索结果,而不是再次分析和执行这个同样的查询。
#如果你的环境中写操作很少,读操作频繁,那么打开query_cache_type=1,会对性能有明显提升。
#如果写操作频繁,查询缓冲也许引起性能下降而不是性能提升,则应该关闭它(query_cache_type=0)。

打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.

查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高.

注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,

#query_cache_size = 128M

只有小于此设定值的结果才会被缓冲

此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.

query_cache_limit = 2M

被全文检索索引的最小的字长.

你也许希望减少它,如果你需要搜索更短字的时候.

注意在你修改此值之后,

你需要重建你的 FULLTEXT 索引

ft_min_word_len = 8

线程使用的堆大小. 此容量的内存在每次连接时被预留.

MySQL 本身常不会需要超过64K的内存

如果你使用你自己的需要大量堆的UDF函数

或者你的操作系统对于某些操作需要更多的堆,

你也许需要将其设置的更高一点.

thread_stack = 512K

设定默认的事务隔离级别.可用的级别如下:

READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE

transaction_isolation = REPEATABLE-READ

#临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。

内部(内存中)临时表的最大大小

此限制是针对单个表的,而不是总和.

tmp_table_size = 128M

记录慢速查询. 慢速查询是指消耗了比 “long_query_time” 定义的更多时间的查询.

如果 log_long_format 被打开,那些没有使用索引的查询也会被记录.

如果你经常增加新查询到已有的系统内的话. 一般来说这是一个好主意,

slow-query-log
slow-query-log-file=slow.log

#新数据表的默认存储引擎(默认设置是MyISAM)。这项设置还可以通过–default-table-type选项来设置。
default_storage_engine = InnoDB

explicit_defaults_for_timestamp = true
#是否显示默认时间戳

所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.

不要在这里使用”1″, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别).

long_query_time = 3

在慢速日志中记录更多的信息.

一般此项最好打开.

打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里

#log_long_format

此目录被MySQL用来保存临时文件.例如,

它被用来处理基于磁盘的大型排序,和内部排序一样.

以及简单的临时表.

如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好

另一种选择是你也可以将其放置在独立的磁盘上.

你可以使用”;”来放置多个路径

他们会按照roud-robin方法被轮询使用.

#tmpdir = /tmp

Don't listen on a TCP/IP port at all. This can be a security enhancement,

if all processes that need to connect to mysqld run on the same host.

All interaction with mysqld must be made via Unix sockets or named pipes.

Note that using this option without enabling named pipes on Windows

(via the "enable-named-pipe" option) will render mysqld useless!

#skip-networking

#这些路径相对于datadir

打开二进制日志功能.

在复制(replication)配置中,作为MASTER主服务器必须打开此项

如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.

log-bin=mysql-bin

binary logging format - mixed recommended

binlog_format=mixed

#启用二进制日志后,保留日志的天数。服务器会自动清理指定天数前的日志文件,如果不设置则会导致服务器空间耗尽。一般设置为7~14天。
expire_logs_days = 10

required unique id between 1 and 2^32 - 1

defaults to 1 if master-host is not set

but will not function as a master if omitted

#在复制数据同步的时候会用到
server-id = 1

Replication Slave (comment out master section to use this)

#

To configure this host as a replication slave, you can choose between

two methods :

#

1) Use the CHANGE MASTER TO command (fully described in our manual) -

the syntax is:

#

CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,

MASTER_USER=, MASTER_PASSWORD= ;

#

where you replace , , by quoted strings and

by the master's port number (3306 by default).

#

Example:

#

CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,

MASTER_USER='joe', MASTER_PASSWORD='secret';

#

OR

#

2) Set the variables below. However, in case you choose this method, then

start replication for the first time (even unsuccessfully, for example

if you mistyped the password in master-password and the slave fails to

connect), the slave will create a master.info file, and any later

change in this file to the variables' values below will be ignored and

overridden by the content of the master.info file, unless you shutdown

the slave server, delete master.info and restart the slaver server.

For that reason, you may want to leave the lines below untouched

(commented) and instead use CHANGE MASTER TO (see above)

#

required unique id between 2 and 2^32 - 1

(and different from the master)

defaults to 2 if master-host is set

but will not function as a slave if omitted

#server-id = 2
#

The replication master for this slave - required

#master-host =
#

The username the slave will use for authentication when connecting

to the master - required

#master-user =
#

The password the slave will authenticate with when connecting to

the master - required

#master-password = #

The port the master is listening on.

optional - defaults to 3306

#master-port = #

binary logging - not required for slaves, but recommended

#log-bin=mysql-bin

#InnoDB主目录,所有与InnoDB数据表有关的目录或文件路径都相对于这个路径。在默认的情况下,这个主目录就是MySQL的数据目录。

Uncomment the following if you are using InnoDB tables

#innodb_data_home_dir = /opt/mysql/mysqldata

#用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等)。
#在默认的情况下,InnoDB驱动程序将使用 MySQL数据目录作为自己保存日志文件的位置。
#innodb_log_group_home_dir = /opt/mysql/mysqldata

#*** MyISAM 相关选项

关键词缓冲的大小, 一般用来缓冲MyISAM表的索引块.

#MySQL5.5默认为InnoDB存储引擎,所以这个参数可以设置小点

不要将其设置大于你可用内存的30%,

因为一部分内存同样被OS用来缓冲行数据

甚至在你并不使用MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用.

key_buffer_size = 128M

#该参数用于表的顺序扫描,表示每个线程分配的缓冲区大小。比如在进行全表扫描时,MySQL会按照数据的存储顺序依次读取数据块,每次读取的数据块首先会暂存在read_buffer_size中,当buffer空间被写满或者全部数据读取结束后,再将buffer中的数据返回给上层调用者,以提高效率。默认为128K,这个参数不要设置过大,一般在128~256之间。

用来做MyISAM表全表扫描的缓冲大小.

#read_buffer_size = 8M

#该参数用于表的随机读取,表示每个线程分配的缓冲区大小。
#比如,按照一个非索引字段做order by排序操作时,就会利用这个缓冲区来暂存读取的数据。
#默认为256KB,这个参数不要设置过大,一般在128~512KB。

当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道.

如果你增高此值,可以提高很多ORDER BY的性能.

当需要时由每个线程分配

read_rnd_buffer_size = 64M

MyISAM 使用特殊的类似树的cache来使得突发插入

(这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA

INFILE) 更快. 此变量限制每个进程中缓冲树的字节数.

设置为 0 会关闭此优化.

为了最优化不要将此值设置大于 “key_buffer_size”.

当突发插入被检测到时此缓冲将被分配.

#MyISAM:仅在内存中保存索引。
#InnoDB:在内存中保存索引和数据。
#结论:保存在内存的内容访问速度要比磁盘上的更快。
#转换存储引擎的命令:
#ALTER TABLE table_name ENGINE=InnoDB;
bulk_insert_buffer_size = 256M

#当对MyISAM表执行repair table或创建索引时,用以缓存排序索引;
#设置太小时可能会遇到” myisam_sort_buffer_size is too small”

此缓冲当MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配.

这在每个线程中被分配.所以在设置大值时需要小心.

myisam_sort_buffer_size = 8M

MySQL重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).

如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)

myisam_max_sort_file_size = 10G

如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法.

这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引.

#myisam_max_extra_sort_file_size = 10G

如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.

这对于拥有多个CPU以及大量内存情况的用户,是一个很好的选择.

myisam_repair_threads = 1

自动检查和修复没有适当关闭的 MyISAM 表.

myisam_recover

默认关闭 Federated

#skip-federated

*** BDB 相关选项 ***

如果你运行的MySQL服务有BDB支持但是你不准备使用的时候使用此选项. 这会节省内存并且可能加速一些事.

#skip-bdb

附加的内存池被InnoDB用来保存 metadata 信息

如果InnoDB为此目的需要更多的内存,它会开始从OS这里申请内存.

由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值.

SHOW INNODB STATUS 命令会显示当先使用的数量.

innodb_additional_mem_pool_size = 64M

InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM.

这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.

在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%

不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.

注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,

所以不要设置的太高.

#对此(假设你的服务器仅仅运行 MySQL),公认的“经验法则”是设置为你的服务器物理内存的 80%。
#在保证操作系统不使用交换分区而正常运行所需要的足够内存之后 ,尽可能多地为 MySQL 分配物理内存。
#因此,如果你的服务器物理内存是 32 GB,可以将那个参数设置为多达 25 GB。
#如果你的服务器内存较小并且小于 1 GB。为了适用本文的方法,你应该去升级你的服务器。
#如果你的服务器内存特别大,比如,它有 200 GB,那么,根据一般常识,你也没有必要为操作系统保留多达 40 GB 的内存。
innodb_buffer_pool_size = 25G

#如果服务器上的参数 innodb_buffer_pool_size 的配置是大于 1 GB,将根据参数 innodb_buffer_pool_instances 的设置, 将 InnoDB 的缓冲池划分为多个。
#在多线程同时访问缓冲池时可能会遇到瓶颈。你可以通过启用多缓冲池来最小化这种争用情况:
#为了实现最佳的效果,要综合考虑 innodb_buffer_pool_instances 和 innodb_buffer_pool_size 的设置,以确保每个实例至少有不小于 1 GB 的缓冲池。
#因此,在我们的示例中,将参数 innodb_buffer_pool_size 设置为 25 GB 的拥有 32 GB 物理内存的服务器上。一个合适的设置为 25600M / 24 = 1.06 GB
innodb_buffer_pool_instances = 24

#用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出;
#表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。

InnoDB 将数据保存在一个或者多个数据文件中成为表空间.

如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.

其他情况下.每个设备一个文件一般都是个好的选择.

你也可以配置InnoDB来使用裸盘分区 – 请参考手册来获取更多相关内容

innodb_data_file_path = ibdata1:10M:autoextend

用来同步IO操作的IO线程的数量. This value is

此值在Unix下被硬编码为4,但是在Windows磁盘I/O可能在一个大数值下表现的更好.

innodb_file_io_threads = 4

在InnoDb核心内的允许线程数量.

最优值依赖于应用程序,硬件以及操作系统的调度方式.

过高的值可能导致线程的互斥颠簸.

innodb_thread_concurrency = 16

#这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为”同步”)到硬盘上。
#设置值0的意思是每隔一秒写一次日 志并进行 同步,这可以减少硬盘写操作次数,但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步,这可以防止数据丢失,但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法,即每执行完一条COMMIT命令写一次日志,每隔一秒进行一次同步。

如果设置为1 ,InnoDB会在每次提交后刷新(fsync)事务日志到磁盘上,

这提供了完整的ACID行为.

如果你愿意对事务安全折衷, 并且你正在运行一个小的事物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O

0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘.

2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.

innodb_flush_log_at_trx_commit = 2

用来缓冲日志数据的缓冲区的大小.

当此值快满时, InnoDB将必须刷新数据到磁盘上.

由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)

#事务日志所使用的缓存区。InnoDB在写事务日志的时候,为了提高性能,先将信息写入Innodb Log Buffer中,当满足innodb_flush_log_trx_commit参数所设置的相应条件(或者日志缓冲区写满)时,再将日志写到文件(或者同步到磁盘)中。
#可以通过innodb_log_buffer_size参数设置其可以使用的最大内存空间。默认是8MB,一般为16~64MB即可。
innodb_log_buffer_size = 16M

在日志组中每个日志文件的大小.

你应该设置日志文件总合大小到你缓冲池大小的25%~100%

来避免在日志文件覆写上不必要的缓冲池刷新行为.

不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.

innodb_log_file_size = 512M

在日志组中的文件总数.

通常来说2~3是比较好的.

innodb_log_files_in_group = 3

在InnoDB缓冲池中最大允许的脏页面的比例.

如果达到限额, InnoDB会开始刷新他们防止他们妨碍到干净数据页面.

这是一个软限制,不被保证绝对执行.

innodb_max_dirty_pages_pct = 90

#如果某个事务在等待n秒(s)后还没有获得所需要的资源,就使用ROLLBACK命令放弃这个事务。
#这项设置对于发现和处理未能被InnoDB数据表驱动 程序识别出来的死锁条件有着重要的意义。这个选项的默认设置是50s。

在被回滚前,一个InnoDB的事务应该等待一个锁被批准多久.

InnoDB在其拥有的锁表中自动检测事务死锁并且回滚事务.

如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了InnoDB以外的其他事务安全的存储引擎

那么一个死锁可能发生而InnoDB无法注意到.

这种情况下这个timeout值对于解决这种问题就非常有帮助.

innodb_lock_wait_timeout = 120

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

Remove the next comment character if you are not familiar with SQL

#safe-updates

[myisamchk]
key_buffer_size = 2048M
sort_buffer_size = 2048M
read_buffer = 32M
write_buffer = 32M

[mysqlhotcopy]
interactive-timeout

[mysqld_safe]

增加每个进程的可打开文件数量.

警告: 确认你已经将全系统限制设定的足够高!

打开大量表需要将此值设大

open_files_limit = 65535

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code