mysql调优笔记怎么调 mysql怎么优化

mysql 参数调优(11)之innodb_buffer_pool_instances设置多个缓冲池实例MySQL 5.5引入了缓冲实例作为减小内部锁争用来提高MySQL吞吐量的手段 。在5.5版本这个对提升吞吐量帮助很小,然后在MySQL 5.6版本这个提升就非常大了,所以在MySQL5.5中你可能会保守地设置innodb_buffer_pool_instances=4,在MySQL 5.6和5.7中你可以设置为8-16个缓冲池实例 。设置后观察会觉得性能提高不大,但在大多数高负载情况下,它应该会有不错的表现 。对了,不要指望这个设置能减少你单个查询的响应时间 。这个是在高并发负载的服务器上才看得出区别 。比如多个线程同时做许多事情 。
5.7、8.0 下INNODB_BUFFER_POOL_INSTANCES默认为1,若mysql存在高并发和高负载访问,设置为1则会造成大量线程对BUFFER_POOL的单实例互斥锁竞争,这样会消耗一定量的性能的 。
pool_instances 可以设置为cpu核心数 , 它的作用是:
1)对于缓冲池在数千兆字节范围内的系统,通过减少争用不同线程对缓存页面进行读写的争用,将缓冲池划分为多个单独的实例可以提高并发性 。可以类比为 java中的 ThreadLocal 线程本地变量就是为每个线程维护一个buffer pool实例,这样就不用去争用同一个实例了 。相当于减少高并发下mysql对INNODB_BUFFER缓冲池的争用 。
2)使用散列函数将存储在缓冲池中或从缓冲池读取的每个页面随机分配给其中一个缓冲池实例 。每个缓冲池管理自己的空闲列表,刷新列表,LRU和连接到缓冲池的所有其他数据结构,并受其自己的缓冲池互斥量保护 。
mysql 参数调优(2)之设置重做日志文件的大小 innodb_log_file_size 我们知道redo log包括 buffer和log file的部分 , 这里的innodb_log_file_size是配置log file的大小的 。
innodb_log_file_size这个选项是设置 redo 日志(重做日志)的大小 。这个值的默认为5M,是远远不够的 , 在安装完mysql时需要尽快的修改这个值 。如果对 Innodb 数据表有大量的写入操作,那么选择合适的 innodb_log_file_size 值对提升MySQL性能很重要 。然而设置太大了,就会增加恢复的时间,因此在MySQL崩溃或者突然断电等情况会令MySQL服务器花很长时间来恢复 。
由于事务日志相当于一个写缓冲,而小日志文件会很快的被写满,这时候就需要频繁地刷新到硬盘 , 速度就慢了 。如果产生大量的写操作,MySQL可能就不能足够快地刷新数据,那么写性能将会降低 。
大的日志文件,另一方面,在刷新操作发生之前给你足够的空间来使用 。反过来允许InnoDB填充更多的页面 。对于崩溃恢复 – 大的重做日志意味着在服务器启动前更多的数据需要读?。?更多的更改需要重做 , 这就是为什么崩溃恢复慢了 。
如果不配的后果:默认是5M,这是肯定不够的 。
最后,让我们来谈谈如何找出重做日志的正确大小 。
幸运的是 , 你不需要费力算出正确的大小 , 这里有一个经验法则:在服务器繁忙期间,检查重做日志的总大小是否够写入1-2小时 。你如何知道InnoDB写入多少,使用下面方法可以统计60秒内地增量数据大?。?
mysql show engine innodb status\G select sleep(60); show engine innodb status\G
Log sequence number 4631632062
...
Log sequence number 4803805448
mysql select (4803805448-4631632062) 60/1024/1024;
+--------------------------------------+
| (4803805448-4631632062) 60/1024/1024 |
+--------------------------------------+
|9851.84017181 |
+--------------------------------------+
1 row in set (0.00 sec)
在这个60s的采样情况下,InnoDB每小时写入9.8GB数据 。所以如果innodb_log_files_in_group没有更改(默认是2,是InnoDB重复日志的最小数字),然后设置innodb_log_file_size为10G,那么你实际上两个日志文件加起来有20GB , 够你写两小时数据了 。

推荐阅读