MySQL 优化笔记: innodb_buffer_pool_size、key_buffer_size 和 table_cache
innodb_buffer_pool_size
说明:
表示缓冲池字节大小,默认 128MB
,最大值 32位系统 4294967295B
(2^32-1),约为3.xGB
,64位系统18446744073709551615B
(2^64-1),差不多是18000000TB
。
作用:
主要是缓存innodb表的索引,数据,插入数据时的缓冲。
网上评价:
如果设定的缓冲池的大小大于1G,设置innodb_buffer_pool_instances的值大于1,在服务器繁忙的时候可以提高伸缩性,不过在实际的测试中,发现带来的性能提升并不明显,而且参考了这里的一篇文章mysql优化---第7篇:参数 innodb_buffer_pool_instances设置,初步设置innodb_buffer_pool_instances为1。
这个值设置的越大,在不止一次的访问相同的数据表数据时,消耗的磁盘I / O就越少。在一个专用的数据库服务器,则可能将其设置为高达80%的机器物理内存大小。不过在实际的测试中,发现无限的增大这个值,带来的性能提升也并不显著,对CPU的压力反而增大,设置合理的值才是最优。在出现以下问题时,你就需要考虑减少这个参数的值了:
- 物理内存的竞争可能会导致操作系统分页。
- InnoDB储备额外的内存缓冲区和控制结构,以便总分配空间大于指定的大小大约是10%。
- 地址空间必须是连续的,在通过DLL加载特定地址的Windows系统中,这可能存在问题。
- 初始化缓冲池的时间大致与它的大小成正比。在大型系统中,初始化的时间可能很显著。例如:在现代化的Linux x86_64服务器上,初始化一个10GB的缓冲池大小,大约需要6秒钟。
table_cache
table_cache
是一个非常重要的MySQL性能参数,它在5.1.3之后的版本中叫做 table_open_cache
, table_cache
主要用于设置table高速缓存的数量, 由于每个客户端连接都会至少访问一个表,因此此参数的值与 max_connections
有关。
key_buffer_size
key_buffer_size
是对MyISAM表性能影响最大的一个参数。
参考: mysql Key_buffer_size参数的设置
mysql> show variables like 'key_buffer_size';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| key_buffer_size | 8384512 |
+-----------------+---------+
1 row in set (0.00 sec)
mysql> show global status like 'key_read%';
+-------------------+-----------+
| Variable_name | Value |
+-------------------+-----------+
| Key_read_requests | 597758917 |
| Key_reads | 29400717 |
+-------------------+-----------+
2 rows in set (0.00 sec)
Prod 服务器未命中缓存的概率
key_cache_miss_rate = Key_reads / Key_read_requests * 100%
29400717 / 597758917 * 100% = 0.04918491%
mysql> show global status like 'key_blocks_u%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Key_blocks_unused | 6694 |
| Key_blocks_used | 6694 |
+-------------------+-------+
2 rows in set (0.00 sec)
Key_blocks_unused 表示未使用的缓存簇(blocks)数,Key_blocks_used 表示曾经用到的最大的 blocks 数,比如这台服务器,所有的缓存都用到了,要么增加 key_buffer_size,要么就是过渡索引了,把缓存占满了。比较理想的设置:
Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%
我们 prod 为 50%,偏小,说明。。。