mysql> SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data'; 1.可是当innodb作crash recovery的时候,大的pool buffer会让recovery奇慢无比。 一种折衷的解决方法就是:启动的时候用小的pool buffer,恢复完成之后改用大的pool bufer。设置的过大,会致使system的swap空间被占用,致使操做系统变慢,从而减低sql查询的效率。
2.做用:这个参数主要做用是缓存innodb表的索引,数据,插入数据时的缓冲。
3.方法一:mysql
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_buffer_pool_pages_data | 1388 |
+-------------------------------+-------+
1 row in set (0.00 sec)sql
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total';
+--------------------------------+--------+
| Variable_name | Value |
+--------------------------------+--------+
| Innodb_buffer_pool_pages_total | 131071 |
+--------------------------------+--------+
1 row in set (0.00 sec)数据库
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_page_size';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)缓存
'Innodb_buffer_pool_pages_data' X 100 / 'Innodb_buffer_pool_pages_total'网络
当结果 > 95% 则增长 innodb_buffer_pool_size, 建议使用 ram total 75%
当结果 < 95% 则减小 innodb_buffer_pool_size,
建议 'Innodb_buffer_pool_pages_data' X 'Innodb_page_size' X 1.05 / (1024*1024*1024)性能
4.方法二:测试
Innodb 存储引擎的缓存机制和 MyISAM 的最大区别就在于 Innodb 不只仅缓存索引,同时还会缓存实 际的数据。因此,彻底相同的数据库,使用 Innodb 存储引擎可使用更多的内存来缓存数据库相关的信 息,固然前提是要有足够的物理内存。这对于在如今这个内存价格不断下降的时代,无疑是个很吸引人 的特性。优化
innodb_buffer_pool_size 参数用来设置 Innodb 最主要的 Buffer(Innodb_Buffer_Pool)的大小,也 就是缓存用户表及索引数据的最主要缓存空间,对 Innodb 总体性能影响也最大。不管是 MySQL 官方手册 仍是网络上不少人所分享的 Innodb 优化建议,都简单的建议将 Innodb 的 Buffer Pool 设置为整个系统 物理内存的 50% ~ 80% 之间。如此轻率的给出此类建议,我我的以为实在是有些不妥。spa
不论是多么简单的参数,均可能与实际运行场景有很大的关系。彻底相同的设置,不一样的场景下的 表现可能相差很大。就从 Innodb 的 Buffer Pool 到底该设置多大这个问题来看,咱们首先须要肯定的是 这台主机是否是就只提供 MySQL 服务?MySQL 须要提供的的最大链接数是多少?MySQL 中是否还有 MyISAM 等其余存储引擎提供服务?若是有,其余存储引擎所须要使用的 Cache 须要多大?操作系统
假设是一台单独给 MySQL 使用的主机,物理内存总大小为 8G,MySQL 最大链接数为 500,同时还使用 了 MyISAM 存储引擎,这时候咱们的总体内存该如何分配呢?
内存分配为以下几大部分:
a) 系统使用,假设预留 800M;
b) 线程独享,约 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
c) MyISAM Key Cache,假设大概为 1.5GB;
d) Innodb Buffer Pool 最大可用量:8GB - 800MB - 2GB - 1.5GB = 3.7GB;
假设这个时候咱们还按照 50%~80%的建议来设置,最小也是 4GB,而经过上面的估算,最大可用值 在 3.7GB 左右,那么极可能在系统负载很高当线程独享内存差很少出现极限状况的时候,系统极可能就 会出现内存不足的问题了。并且上面还仅仅只是列出了一些使用内存较大的地方,若是进一步细化,很 可能可用内存会更少。上面只是一个简单的示例分析,实际状况并不必定是这样的,这里只是但愿你们了解,在设置一些 参数的时候,千万不要想固然,必定要详细的分析可能出现的状况,而后再经过不断测试调整来达到自 己所处环境的最优配置。就我我的而言,正式环境上线之初,我通常都会采起相对保守的参数配置策 略。上线以后,再根据实际状况和收集到的各类性能数据进行针对性的调整。
当系统上线以后,咱们能够经过 Innodb 存储引擎提供给咱们的关于 Buffer Pool 的实时状态信息做 出进一步分析,来肯定系统中 Innodb 的 Buffer Pool 使用状况是否正常高效:
sky@localhost : example 08:47:54> show status like 'Innodb_buffer_pool_%';
+-----------------------------------+-------+
| Variable_name | Value |
+-----------------------------------+-------+
| Innodb_buffer_pool_pages_data | 70 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_pages_flushed | 0 |
| Innodb_buffer_pool_pages_free | 1978 |
| Innodb_buffer_pool_pages_latched | 0 |
| Innodb_buffer_pool_pages_misc | 0 |
| Innodb_buffer_pool_pages_total | 2048 |
| Innodb_buffer_pool_read_ahead_rnd | 1 |
| Innodb_buffer_pool_read_ahead_seq | 0 |
| Innodb_buffer_pool_read_requests | 329 |
| Innodb_buffer_pool_reads | 19 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 0 |
+-----------------------------------+-------+
从上面的值咱们能够看出总共 2048 pages,还有 1978 是 Free 状态的仅仅只有 70 个 page 有数据, read 请求 329 次,其中有 19 次所请求的数据在 buffer pool 中没有,也就是说有 19 次是经过读取物理 磁盘来读取数据的,因此很容易也就得出了 Innodb Buffer Pool 的 Read 命中率大概在为:(329 - 19)/ 329 * 100% = 94.22%。
固然,经过上面的数据,咱们还能够分析出 write 命中率,能够获得发生了多少次 read_ahead_rnd,多少次 read_ahead_seq,发生过多少次 latch,多少次由于 Buffer 空间大小不足而产 生 wait_free 等等。
单从这里的数据来看,咱们设置的 Buffer Pool 过大,仅仅使用 70 / 2048 * 100% = 3.4%。
在 Innodb Buffer Pool 中,还有一个很是重要的概念,叫作“预读”。通常来讲,预读概念主要是 在一些高端存储上面才会有,简单来讲就是经过分析数据请求的特色来自动判断出客户在请求当前数据 块以后可能会继续请求的数据快。经过该自动判断以后,存储引擎可能就会一次将当前请求的数据库和 后面可能请求的下一个(或者几个)数据库一次所有读出,以指望经过这种方式减小磁盘 IO 次数提升 IO 性能。在上面列出的状态参数中就有两个专门针对预读:
Innodb_buffer_pool_read_ahead_rnd,记录进行随机读的时候产生的预读次数; Innodb_buffer_pool_read_ahead_seq,记录连续读的时候产生的预读次数;