引言
在我们的程序运行中,mysql的吞吐速度对程序的影响是特别大的,所以我们平常开发过程中对mysql进行语句以及索引上的一些优化基本上是开发的常用手段了,但是有些时候索引跟sql的优化是局限于mysql的配置文件依赖的,一般mysql都是有默认配置,但是它的默认配置对于高吞吐的项目是不行的,如果我们平常的服务器部署mysql使用它的默认配置,是很难让其能够完全利用服务器的性能的。
解决方案
以下是我针对于16核64G服务器Mysql5.7配置的详细优化,如果是同等配置的服务器直接用就行,如果配置不一致请按需调整,配置文件一般都是/etc/my.cnf文件。
[mysqld]
server_id=2
log_bin=mysql-bin
binlog_format=ROW
expire_logs_days = 7
#服务器在启动时加载插件,并防止在服务器运行时删除插件。
validate-password=FORCE_PLUS_PERMANENT
# 最大连接(用户)数
#这个值,建议根据实际需求调整,例如 1000 到 5000 之间。
max_connections=5000
#wait_timeout=28800
#interactive_timeout=28800
# back_log 是操作系统在监听队列中所能保持的连接数,
# 队列保存了在MySQL连接管理器线程处理之前的连接.
# 如果你有非常高的连接率并且出现”connection refused” 报错,
# 你就应该增加此处的值.
# 检查你的操作系统文档来获取这个变量的最大值.
# 如果将back_log设定到比你操作系统限制更高的值,将会没有效果
back_log=384
# 用户打开的文件描述符数量
open_files_limit=65535
# 打开表的数量缓存
table_open_cache=1600
# 接受的数据包大小
# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)
# 每个连接独立的大小.大小动态增加
max_allowed_packet=500M
# 独立的内存表所允许的最大容量.
# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.
max_heap_table_size=4096M
# 内部(内存中)临时表的最大大小
# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表.
# 此限制是针对单个表的,而不是总和.
tmp_table_size=4096M
# 用来做MyISAM表全表扫描的缓冲大小.
# 当全表扫描需要时,在对应线程中分配.
read_buffer_size=256M
#read_buffer_size=15872M
# 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道.
# 如果你增高此值,可以提高很多ORDER BY的性能.
# 当需要时由每个线程分配
read_rnd_buffer_size=256M
# 此缓冲当MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配.
# 这在每个线程中被分配.所以在设置大值时需要小心.
sort_buffer_size=512M
# 此缓冲被使用来优化全联合(full JOINs 不带索引的联合).
# 类似的联合在极大多数情况下有非常糟糕的性能表现,
# 但是将此值设大能够减轻性能影响.
# 通过 “Select_full_join” 状态变量查看全联合的数量
# 当全联合发生时,在每个线程中分配
join_buffer_size=4096M
# 关键词缓冲的大小, 一般用来缓冲MyISAM表的索引块.
# 不要将其设置大于你可用内存的30%,
# 因为一部分内存同样被OS用来缓冲行数据
# 甚至在你并不使用MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用.
key_buffer_size=128M
#key_buffer_size=1024M
# 我们在cache中保留多少线程用于重用
# 当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,
# 则客户端线程被放入cache中.
# 这可以在你需要大量新连接的时候极大的减少线程创建的开销
# (一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)
thread_cache_size=64
#thread_concurrency=16
# 只有小于此设定值的结果才会被缓冲
# 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖
query_cache_limit=2M
# 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果.
# 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.
# 查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高.
# 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,
# 查询缓冲也许引起性能下降而不是性能提升.
query_cache_size=256M
#innodb引擎
innodb_file_per_table=1
innodb_open_files=1000
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_size=50G
innodb_thread_concurrency=0
innodb_purge_threads=1
innodb_log_buffer_size=128M
innodb_log_file_size=512M
innodb_max_dirty_pages_pct=85
innodb_flush_method=O_DIRECT
innodb_autoinc_lock_mode=2
innodb_buffer_pool_dump_at_shutdown=1
innodb_buffer_pool_load_at_startup=1