无论对于哪一种数据库,缓存技术都是提高数据库性能的关键
,物理磁盘的访问速度与内存的访问速度永远都不是一个数量级的。通过缓存技术无论是在读还是写方面,都可以大大提高数据库整体性能。
Innodb_buffer_pool_size的合理设置
InnoDB存储引擎的缓存机制和MyISAM的最大区别就在于InnoDB不仅仅缓存索引,同时还会缓存实际的数据
。所以,完全相同的数据库,InnoDB存储引擎可以使用更多的内存来缓存数据库相关的信息,前提是要有足够的物理内存。这对于内存价格不断降低的时代,无疑是个很吸引人的特性。
innodb_buffer_pool_size
参数用来设置InnoDB最主要的Buffer(Innodb BufferPool)的大小,也就是缓存用户表及索引数据的最主要缓存空间,对InnoDB整体性能影响也最大。无论是MySQL官方手册还是网络上很多人分享的InnoDB优化建议,都是简单地建议将InnoDB的Buffer Pool设置为整个系统物理内存的50%~80%之间。如此轻率地给出此类建议实在有些不妥。
不管是多么简单的参数,都可能与实际运行场景有很大的关系
。完全相同的设置,在不同的场景下表现可能相差很大。从InnoDB的Buffer Pool到底该设置多大这个问题来看,首先须要确定的是这台主机是不是只能提供MySQL服务?MySQL须要提供的最大连接数是多少?MySQL中是否还有MyISAM等其他存储引擎提供服务?如果有,其他存储引擎所需的Cache有要多大?
假设是一台单独给MySQL使用的主机,物理内存总大小为8GB,MySQL最大连接数为500,同时还使用了MyISAM存储引擎,这时候整体内存该如何分配呢?
内存分配为如下几大部分。
(1)系统使用,假设预留800MB。
(2)线程独享,最大约为2GB = 500×(1MB + 1MB + 1MB + 512KB +512KB),组成大概如下:
sort_buffer_size:1MB
join_buffer_size:1MB
read_buffer_size:1MB
read_rnd_buffer_size:512KB
thread_statck:512KB
(3)MyISAM Key Cache,假设大概为1.5GB。
(4)InnoDB Buffer Pool最大可用量:8GB-800MB-2GB-1.5GB = 3.7GB。
假设这个时候还按照50%~80%的建议来设置,最小也是4GB。通过估算,最大可用值在3.7GB左右,那么在系统负载很高,线程独享内存差不多到极限时,系统很可能就会出现内存不足的问题了。而且上面还只是列出了一些使用内存较大的地方,如果进一步细化,很可能导致可用内存更少。
上面只是一个简单的示例分析,实际情况并不一定是这样的。这里只是希望大家了解,在设置一些参数的时候千万不要想当然,一定要详细地分析可能出现的情况,然后再通过不断测试和调整来达到所处环境的最优配置
。就我个人而言,正式环境上线之初,一般都会采取相对保守的参数配置策略。上线之后,再根据实际情况和收集到的各种性能数据进行针对性调整。
总结
- 缓存是提高数据库性能的关键
- innodb_buffer_pool_size的设置要合理