本文目录一览:
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和连接到缓冲池的所有其他数据结构,并受其自己的缓冲池互斥量保护。
数据库缓冲池有什么作用
其实就是一个存储转发的作用,如果你访问的信息在缓冲池就直接在缓冲里面拿,这对于降低数据库压力,提高数据库性能和速度有明显的效果
数据库实例的作用是什么?
数据库实例由各种高速缓冲池以及后台进程组成。
数据库是数据以某中方式组织起来的数据集合,物理存储为数据库文件,数据库实例负责维护,访问来这些数据。
打个比方:
你在文本中有一些数据(数据库文件)需要计算,你就要写一个程序(后台进程),计算这些数据,如果计算中有源中间结果,你就需要把数据的中间结果放到内存中的一个区域中(高速缓冲池),然后再取出这些中间结果计算。
当然这只是打个比方,实际数据库实例要处理的东西要多得多。
举个很形象的例子(呵呵):
一个实例就像一台绞肉机,每台绞肉机都可以绞肉。
大块的肉放进去做为输入(T-SQL),碎肉挤出来做为输出(结果集)。
你每运行一次安装程序,只能装一台绞肉机。
当然,你可以在服务器上装好几台绞肉机,但是必须有不同的名字:绞肉机A,绞zhidao肉机B...