理解innodb buffer pool

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

innodb buffer pool有几个目的:

  • 缓存数据--众所周知,这个占了buffer pool的大半空间
  • 缓存目录--数据字典
  • insert buffer
  • 排序的内部结构--比如自适应hash的结构或者一些行锁

查看表的数据和索引使用情况?

SELECT engine,  count(*) as TABLES,
  concat(round(sum(table_rows)/1000000,2),'M') rows,
  concat(round(sum(data_length)/(1024*1024*1024),2),'G') DATA,
  concat(round(sum(index_length)/(1024*1024*1024),2),'G') idx,
  concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') total_size,  
  round(sum(index_length)/sum(data_length),2) idxfrac 
FROM information_schema.TABLES 
WHERE table_schema not in ('mysql', 'performance_schema', 'information_schema','test') 
GROUP BY engine ORDER BY sum(data_length+index_length) DESC LIMIT 10;

+--------+--------+----------+---------+--------+------------+---------+
| engine | TABLES | rows     | DATA    | idx    | total_size | idxfrac |
+--------+--------+----------+---------+--------+------------+---------+
| InnoDB |  71608 | 1644.51M | 130.79G | 82.76G | 213.55G    |    0.63 |
+--------+--------+----------+---------+--------+------------+---------+

idxfrac这个值越低越好,举个例子,表里只有一个唯一索引的数据如下:

+--------+--------+----------+---------+--------+------------+---------+
| engine | TABLES | rows     | DATA    | idx    | total_size | idxfrac |
+--------+--------+----------+---------+--------+------------+---------+
| InnoDB |     16 | 3120.61M | 386.59G | 58.09G | 444.68G    |    0.15 |
+--------+--------+----------+---------+--------+------------+---------+

可见idxfrac可见这个值越低越好。

获取buffer pool占的page个数

select count(*) from information_schema.innodb_buffer_page;
+----------+
| count(*) |
+----------+
| 262142   |
+----------+

获取page类型:

select page_type as Page_Type,sum(data_size)/1024/1024 as Size_in_MB 
from information_schema.innodb_buffer_page 
group by page_type 
order by Size_in_MB desc;
+-------------------+--------------+
| Page_Type         | Size_in_MB   |
+-------------------+--------------+
| INDEX             | 158.66378689 |
| UNKNOWN           | 0.00000000   |
| TRX_SYSTEM        | 0.00000000   |
| SYSTEM            | 0.00000000   |
| FILE_SPACE_HEADER | 0.00000000   |
| IBUF_BITMAP       | 0.00000000   |
| EXTENT_DESCRIPTOR | 0.00000000   |
| ALLOCATED         | 0.00000000   |
| INODE             | 0.00000000   |
| BLOB              | 0.00000000   |
| UNDO_LOG          | 0.00000000   |
| IBUF_FREE_LIST    | 0.00000000   |
| IBUF_INDEX        | 0.00000000   |
+-------------------+--------------+

从这里可以看到数据和索引占了buffer pool的大部分空间。也可以看出来这里有几种重要的页类型:

  • INDEX: B-Tree index
  • IBUF_INDEX: Insert buffer index
  • UNKNOWN: not allocated / unknown state
  • TRX_SYSTEM: transaction system data

buffer pool里每个索引的使用

select table_name as Table_Name, index_name as Index_Name,count(*) as Page_Count, sum(data_size)/1024/1024 as Size_in_MB 
from information_schema.innodb_buffer_page 
group by table_name, index_name 
order by Size_in_MB desc;
+--------------------------------------------+-----------------+------------+-------------+
| Table_Name                                 | Index_Name      | Page_Count | Size_in_MB  |
+--------------------------------------------+-----------------+------------+-------------+
| `magento`.`core_url_rewrite`               | PRIMARY         |       2829 | 40.64266014 |
| `magento`.`core_url_rewrite`               | FK_CORE_URL_... |        680 |  6.67517281 |
| `magento`.`catalog_product_entity_varchar` | PRIMARY         |        449 |  6.41064930 |
| `magento`.`catalog_product_index_price`    | PRIMARY         |        440 |  6.29357910 |
| `magento`.`catalog_product_entity`         | PRIMARY         |        435 |  6.23898315 |
+--------------------------------------------+-----------------+------------+-------------+

一个典型的buffer pool使用监控

从这里图里我们可以看到buffer pool几乎是被填满的,另外预留了10%的空间用来做其他用途。

一般怎么设置buffer pool大小呢?

warm rows data size + warm indexes size (excl. clustered) + 20%

如何预热buffer pool?

在InnoDB上面执行select语句:

  • 对于聚簇索引来说,大多数情况通过SELECT COUNT(*) 加载到buffer pool中了。
  • 对于二级索引来说,要执行一些简单的语句来抓取全部数据,比如select from tbname where 索引的第一列。或者select from tbname force index(二级索引) where colname <>0.

另外,MySQL5.7支持动态修改buffer pool:

mysql> SET GLOBAL innodb_buffer_pool_size=size_in_bytes;

Dump & restore

在MySQL (5.6+), Percona Server (5.5.10+) or MariaDB (10.0+)可以通过以下配置把buffer pool里面的数据dump出来,并在启动的时候加载到内存中:

innodb_buffer_pool_dump_at_shutdown=ON
innodb_buffer_pool_load_at_startup=ON

参考

https://michael.bouvy.net/blog/en/2015/01/18/understanding-mysql-innodb-buffer-pool-size/

http://www.speedemy.com/mysql/17-key-mysql-config-file-settings/innodb_buffer_pool_size/

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
存储 缓存 关系型数据库
【MySQL进阶-08】深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略
【MySQL进阶-08】深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略
1161 0
|
存储 算法 关系型数据库
MySQL之深入InnoDB存储引擎——Buffer Pool
InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。在数据库系统中,由于CPU速度与磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的整体性能。在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页“FIX”在缓冲池中,在下一次读取相同的页时,首先判断该页是否存在缓冲池中,如果存在则被命中,直接读取,否则读取磁盘上的页。
|
存储 关系型数据库 MySQL
MySQL InnoDB的插入缓冲Insert Buffer
MySQL InnoDB的插入缓冲Insert Buffer
238 0
MySQL InnoDB的插入缓冲Insert Buffer
|
SQL 关系型数据库 MySQL
|
存储 消息中间件 缓存
老面试官问我:LRU 和 Innodb Buffer Pool 有什么关系?
老面试官问我:LRU 和 Innodb Buffer Pool 有什么关系?
老面试官问我:LRU 和 Innodb Buffer Pool 有什么关系?
|
关系型数据库 分布式数据库 PolarDB
InnoDB buffer pool flush 策略
### InnoDB buffer pool flush 策略 **1. 刷脏整体策略** 首先从整体上来说, 刷脏的coordinator_thread 会判断进入哪一种场景刷脏 在 buf_flush_page_coordinator_thread() 函数里面 刷脏主要有3个场景 1. 如果 buf_flush_sync_lsn > 0, 则因为r
885 0
|
关系型数据库
MySQL - InnoDB特性 - Buffer Pool漫谈
缓存管理是DBMS的核心系统,用于管理数据页的访问、刷脏和驱逐;虽然操作系统本身有page cache,但那不是专门为数据库设计的,所以大多数数据库系统都是自己来管理缓存。由于几乎所有的数据页访问都涉及到Buffer Pool,因此buffer pool的并发访问控制尤为重要,可能会影响到吞吐量和响应时间,本文主要回顾一下MySQL的buffer Pool最近几个版本的发展(若有遗漏,欢迎评论补充), 感受下最近几年这一块的进步 MySQL5.5之前 只能设置一个buffer pool, 通过innodb_buffer_pool_size来控制, 刷脏由master线程承担,扩展性差。
3488 0
|
5月前
|
存储 网络协议 关系型数据库
MySQL8.4创建keyring给InnoDB表进行静态数据加密
MySQL8.4创建keyring给InnoDB表进行静态数据加密
140 1
|
9月前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
1620 57
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
5月前
|
SQL 缓存 关系型数据库
使用温InnoDB缓冲池启动MySQL测试
使用温InnoDB缓冲池启动MySQL测试
100 0