介绍如何为MySQL创建合适的配置文件。
确保innodb缓冲池和日志文件大小等设置基本合适 。但除非 在必要时刻, 则没必要改变配置文件, 使用默认设置即可。
MySQL中的配置文件怎么工作的
配置文件位于my.cnf中, 配置的类型有全局配置 、会话配 置 、动态配置文件 。在每次更改后, 使用show variables 确保达 到预期效果。
持久化系统变量
即使使用set global, 也会恢复到配置文件中的状态 。也就是 说需要同时修改配置文件中的值才能达到预期效果 。为此, mysql8引⼊了persist 允许在运行时设置⼀次值, 表示将配置写 ⼊磁盘,下次继续使用。
设置变量的副作用
引起缓冲区刷新脏页, 导致服务器大量工作 。有时, 变量名 并不⼀定是它描述的这样, 比如max_heap_table_size指定内存 中隐式的临时表内存最大值。
规划变量的改变
设置变量要小⼼, 压榨服务器性能并不⼀定有效 。早上的配 置到了晚上就可能不适用了。
什么不该做
不要使用调优脚本, 因为效果并不是强关联性的 。调优服务 器可能是浪费时间 。不要相信某些公式, 并不是可靠的⽅法。
创建mysql配置文件
配置内存使用
线程缓存
每⼀个处于线程缓存或休眠状态的线程通常的内存是 256kb。
配置MySQL的IO行为
innodb在事务提交时写⼊⽇志, 事务对数据的更改通常映射 到表空间的随机位置中 。随机IO的开销比顺序IO更大, 使用⽇志 可以将随机IO转换为顺序IO
innodb如何刷新日志缓冲区
使用互斥锁锁定缓冲区, 可能会有多个事务刷新其⽇志, innodb使用组提交机制, 在单次io时将⼀组⽇志全部提交。
innodb表空间
innodb把数据保存在表空间中, 表空间是个虚拟的⽂件系
统, 由磁盘上的⼀个或多个⽂件组成 。表空间还包含undo log。 修改缓冲区, 双写缓冲区, 和其他结构。
innodb-file-per-table允许为每⼀个表使用单独的⽂件 。将数据 存储在tablename.ibd⽂件中, 更容易回收表的空间, 然而存在空 间的浪费 (每个ibd⽂件都存在浪费) 。
缺点是:使得drop table性能变差 。原因, 删除表空间时需要 innodb查找属于该表空间的⻚⾯时进行锁定和扫描缓冲池, 当缓 冲池过大, 扫描会⾮常慢。
行的旧版本和表空间
如果事务⻓时间打开, 隔离级别在RR环境下, 旧数据⽆法删除, 这会导致数据持续增⻓ 。可以设置innodb_max_purge_lag延 迟更多修改数据的查询之前, 可以等待清除的最大事务数。
其他IO配置选项
sync-binlog 异步刷新binlog的机制。
配置MySQL并发
基本使用⽅法是, 使用innodb-thread-currency变量 。 innodb使用两阶段策略提高线程进⼊内核的效率, 首先休眠指定 的秒数, 然后重试, 失败则进⼊等待队列。
⼀旦进入内核, 线程则拥有⼀定的门票, 这限制了线程在返回等 待队列之前的可以完成的工作量。
提交阶段的并发瓶颈, 可以设置innodb_commit_concurrency控 制同时提交的线程数。
安全设置
max-connect-errors, 设置最大连接错误的上限 。设置大⼀
点, 可以有效禁用由于链接错误而导致阻塞主机。
max-connection, 最大连接数,
skip_name_resolve,此设置禁用DNS查找, 会尝试正在连接 的主机名。
sql-mode, 设置sql的行为。
read_only, super-read-only 。设置为只读数据库
高级innodb设置
innodb_autoinc_lock_mode设置自增主键的方式, innodb_buffer_pool_instances, 提高MySQL的并发。 innodb_io_capacity, 告知innodb多少io容量可使用。
innodb_read_io_threads和innodb_write_io_threads, 读写 的线程数量大小。
innodb_strict_mode,严格模式将警告变为错误。
innodb_old_blocks_time, 指定页面从年轻->老年部分所需 要的时间 。LRU算法。