mysql 配置优化
Mysql的最大连接数设置多少合适呢?
对照阿里云的TCP连接数来看一下,阿里云的TCP连接数可以看出瞬间并发量的多少,然后跟我们的数据库连接数做个对比。正常情况下TCP连接数为1K左右的时候,MySQL的连接数为400左右。本来瞬间的并发量能达到9K, 但是我将一部分流量导入到其他服务器上,所以现在最高的并发量能够达到3.4K。当最大3.4K并发量的时候,有两台服务器同时访问mysql,我的数据库连接数是1153个左右。
mysql my.ini 配置 (以windows版本为例)
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=D:\Program Files\mysql8
# 设置mysql数据库的数据的存放目录
datadir=D:\Program Files\mysql8\data
# 允许最大连接数
max_connections=1000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors= 10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
# mysql 错误日志目录
log-error = "D:/Program Files/mysql8/log/error.log"
# 开启慢查询日志
slow_query_log = ON
# 慢查询日志存储路径
slow_query_log_file = "D:/Program Files/mysql8/log/slow.log"
# 最长执行时间 (查询的最长时间,超过了这个时间则记录到日志中)
long_query_time = 1
#没有使用到索引的查询也将被记录在日志中
#log-queries-not-using-indexes = ON
# 管理语句不会被记录到慢查询日志,包括 ALTER TABLE、ANALYZE TABLE、CHECK TABLE、CREATE INDEX、DROP INDEX、OPTIMIZE TABLE 以及 REPAIR TABLE。
# 如果想要记录这些操作,可以将 log_slow_admin_statements 设置为 ON
#log_slow_admin_statements = OFF
# 开启通用查询日志
general_log=ON
# 通用查询日志目录
general_log_file= "D:/Program Files/mysql8/log/logmysql.log"
# 默认的8 thread_concurrency应设为CPU核数的2倍.
thread_concurrency
# MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中
back_log = 500
#超过 30 天的 binlog 删除
expire_logs_days = 30
# 配置innodb 缓冲池大小 ,推荐为内存的75%(服务器只运行数据库 且只有innodb表时)
innodb_buffer_pool_size = 2G
# 空值缓冲池的个数 默认一个 (配置多个可以提高并发性能)
innodb_buffer_pool_instances = 2
# innodb log 缓冲大小 用来缓冲日志数据的缓冲区的大小.当此值快满时, InnoDB 将必须刷新数据到磁盘上.由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)
innodb_log_buffer_siz = 8M
# 如果设置为 1 ,InnoDB 会在每次提交后刷新(fsync)事务日志到磁盘上,这提供了完整的 ACID 行为.如果你愿意对事务安全折衷, 并且你正在运行一个小的事务,
# 你可以设置此值到 0 或者 2 来减少由事务日志引起的磁盘 I/O
# 0 代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘.
# 2 代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.
# 一般建议为2 如果对数据安全性要求较高 可以使用默认值1
innodb_flush_log_at_trx_commit = 1
# innodb使用后台线程处理数据页上的读写 I/O(输入输出)请求,根据你的 CPU 核数来更改,默认是4
# 注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64
innodb_write_io_threads = 4
innodb_read_io_threads = 4
#InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间 默认为OFF (innodb_file_per_table = 0)
innodb_file_per_table = 1
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
[mysqld_safe]
#不开启sql严格模式
sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"