mysql5.6基本的优化配置
InnoDB设置
1.innodb_buffer_pool_size,默认值是128M。这是最重要的优化选项,因为它指定使用InnoDB加载数据和索引的内存量(数据+指标)。根据特殊的MySQL服务器,该物理内存50-80%范围划定。例如,该机64GB的物理内存缓冲池应设置50GB。
如果设置的值较大,则可能存在风险。例如,内存不够,左为操作系统和MySQL的子系统(子系统),依靠文件系统缓存,包括二进制二进制(二进制日志),InnoDB事务日志(日志),等。
2.innodb_log_file_size,默认值为48m,需要增加这个值允许在较长一段时间的背景检查活动以提高性能非常高的系统吞吐率。流畅的写作,将此值设置为4G是非常安全的。过去的实践表明,日志文件太大,缺点是增加了修复所需的崩溃时间,但在5.5和5.6方面有了很大的改进。
3.innodb_flush_method,默认值是fdatasync。如果硬件RAID磁盘控制器的使用可能需要设置为o_direct。在读取InnoDB缓冲池可以防止双缓冲区(缓冲)的效果,否则会形成2份文件系统缓存和InnoDB缓存(复印件)。
如果你不使用硬件RAID控制器或使用SAN存储,o_direct可能导致性能退化。MySQL的用户手册和错误# 54306详细解释这一点。
4.innodb_flush_neighbors,默认值是1。SSD存储应该设置为0(禁用),因为使用IO命令没有任何性能增益。在某些硬件中,RAID也应该禁用此设置,因为在物理磁盘中逻辑上相邻的块不能保证它是连续的。
5.innodb_io_capacity和innodb_io_capacity_max:这些设置会影响进行每秒InnoDB在后台操作的数量。如果您了解硬件性能的深度(比如每秒执行IO操作的次数),那么使用这些函数是非常可取的,而不是让它空闲。
有一个很好的例子:如果没有一个类似的机票卖给一些人,那么后来的航班就起飞了,可能有一个好的策略来防止背部遭遇恶劣的天气。这样的机会将进行后台操作,以后的实时操作可能是一样的,以减少竞争。
有一个很简单的计算:如果每一个读写磁盘每秒(IOPS)可以达到200倍,RAID10磁盘阵列磁盘IOPS理论有10(10 / 2)= 1000。* 200 =我说这很简单,因为RAID控制器通常可以提供额外的整合,切实提高IOPS SSD磁盘IOPS可以达到上千的能力。
这两个值设置得太高可能会有一些风险,你当然不想干扰后台操作IO操作性能的任务。过去的经验表明,两值设置的太高,我们认为内部锁会导致性能降低(我在这mysql5.6了解到的信息有了很大的提高)。
innodb_lru_scan_depth -默认值是1024,这是介绍MySQL 5.6的新选择。Mark Callaghan提供了一些配置建议。简单的说,如果我们增加innodb_io_capacity价值,我们应该增加innodb_lru_scan_depth。同时。
复制(复制)
如果服务器是支持主从复制,或时间点恢复,在这种情况下,我们需要:
1.log-bin启用二进制日志。默认情况下,二进制日志不是安全的和意外的(不是崩溃安全的),但是正如我之前的文章所说,我建议大多数用户应该以稳定为目标。在这种情况下,您需要启用:sync_binlog = 1,sync_relay_log = 1,中继日志信息库=表和主信息库=表。
2.expire-logs-days --旧的日志将永远保留。我建议把它定为1-10天。节省时间没有多大用处,因为从备份中恢复要快得多。
3.server-id -复制拓扑中的所有服务器必须设置一个独特的server-id.
4。binlog_format =行修改复制基于。我最近写了另一篇文章,里面的复制,我真的很喜欢,因为它可以减少资源锁定提高性能。除了两附加设置开放:事务隔离= read-committed和innodb_autoinc_lock_mode = 2。
其他配置(杂项)
1。时区为GMT时区设置为格林尼治时间。系统管理员越来越多的建议,所有的服务器都设置为格林尼治时间(GMT)。这是我个人的爱好,因为现在几乎所有的企业都是全球性的。设置你的本地时区是任意的。
前2。字符集服务器= utf8mb4整理服务器= utf8mb4_general_ci如文中所述,UTF8编码是为了更好的新的应用程序的默认选项。您还可以设置跳过字符集客户端握手的其他单词,以忽略应用程序想要设置字符集(字符集)。
3.sql-mode -- MySQL是非常宽容的默认规则的数据和自动截断数据。在我以前的文章中,我提到了新的应用程序最好设置为:复制代码代码如下:strict_trans_tables,error_for_division_by_zero。
no_auto_create_user,no_auto_value_on_zero,
no_engine_substitution,no_zero_date,
no_zero_in_date,only_full_group_by。
4.skip-name-resolve --禁止反向域名解析。DNS解析可能在某些系统上很慢/不稳定,所以如果您不需要基于主机名的授权,我建议避免这种解析。
5.max_connect_errors - Todd Farmer写道:这一功能提供保护免受暴力攻击没有实际意义的访问。事实上,当跳过名称解决设置,max_connect_errors甚至不工作。
防火墙是一个更合适的解决方案。通常我会筛选3306个端口,不管是公共网络还是内部网络端口。只有一个特定的应用程序可以访问和连接到MySQL…
我通常设置max_connect_errors = 100000,所以我可以避免双重化配置,确保不要紧。
6.max-connections -默认值是151。我看到很多用户设置他,大部分是在300到1000之间。
通常,这个值将不可避免地被设置。但我的紧张,16核的机器只有约2倍~ 10x连接执行能力的情况下,IO阻塞。
您可能希望许多打开的连接处于空闲状态并且处于休眠状态。但如果它们处于活动状态,它们可能会创建许多新线程(线程鞭打)。
如果条件允许,您可以为应用程序配置数据库连接池(连接池)来解决这个问题,而不是打开和维护大量连接;
当然,那些不使用非汇集、快速打开、并在完成任务后尽快关闭连接的人也是可行的。
从5.5开始的另一个解决方案(MySQL社区和企业版本之间有一些差异)是线程池插件的使用。
摘要(结论)
假设MySQL服务器的配置是:
1.64gb物理内存
2。硬件RAID控制器(假设IO高达2000 IOPS每秒)
三.需要主和从复制(复制)
4。新的应用程序(例如非遗留系统)
5。有防火墙保护
6。不需要基于域名的授权(主机名,主机名)
7。全局应用程序不希望在时区中进行修复。
8。希望程序是可靠的和稳定的(持久的)。
配置可以如下所示:
复制代码代码如下所示:
# InnoDB设置
innodb_buffer_pool_size = 50g
innodb_log_file_size = 2g
innodb_flush_method = o_direct
innodb_io_capacity = 2000
innodb_io_capacity_max = 6000
innodb_lru_scan_depth = 2000
#二进制日志/复制
Log-bin
sync_binlog = 1
sync_relay_log = 1
中继日志信息存储库=表
主信息存储库=表
expire_logs_days = 10
binlog_format =行
事务隔离= read-committed
innodb_autoinc_lock_mode = 2
#其他
GMT时区=
服务器= utf8字符集
整理服务器= utf8_general_ci
SQL模式=strict_trans_tables,
error_for_division_by_zero,
no_auto_create_user,
no_auto_value_on_zero,
no_engine_substitution,
no_zero_date,
no_zero_in_date,
only_full_group_by
skip-name_resolve
马克斯连接错误= 100000
最大连接数= 500
本机#独特
服务器id = 123