什么设置 innodb_buffer_pool 以及为什么..?

Abd*_*naf 22 mysql innodb

我有 170GB 的InnoDB索引和数据。

我必须重新调整 innodb_buffer_pool 大小以获得更好的性能。InnoDB 表(索引+数据)的最大表大小为 28GB。

那么innodb_buffer_pool的最佳大小应该是多少。

更新

我们要将我们的本地数据库迁移到 ec2,因此将根据 innodb 的当前统计数据设置 RAM,这就是为什么我需要缓冲池的大小,以便我们可以在那里拥有可用的 RAM。

文件每表已启用。

我正在使用 Linux 机器。

Rol*_*DBA 28

您拥有的最大表占总数据的 16.47% (28/170)。即使表是高写入和高读取,也不是在某一时刻将表的所有 28G 加载到缓冲池中。您需要计算的是在任何给定时刻在当前数据库服务器上加载了多少 InnoDB 缓冲池

给定当前加载到当前 DB Server 的 InnoDB 缓冲池中的数据集,这是一种更细化的方法来确定新 DB Server 的 innodb_buffer_pool_size。

在您当前的 MySQL 实例(您要迁移的服务器)上运行以下命令

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';  -- IBPDataPages 
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total'; -- IBPTotalPages
SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; -- IPS
Run Code Online (Sandbox Code Playgroud)

运行公式IBPPctFull = IBPDataPages * 100.0 / IBPTotalPages

SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPTotalPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'); -- SELECT @IBPTotalPages;
SET @IBPPctFull = CAST(@IBPDataPages * 100.0 / @IBPTotalPages AS DECIMAL(5,2));
SELECT @IBPPctFull;
Run Code Online (Sandbox Code Playgroud)

如果 IBPPctFull 为 95% 或更多,您应该将 innodb_buffer_pool_size 设置为 DB Server 的 RAM 的 75%。

如果 IBPPctFull 小于 95%,请运行此公式:IBPSize = IPS X IBPDataPages / (1024*1024*1024) X 1.05

SET @IBPSize = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_page_size'); -- SELECT @IBPSize;
SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPSize = concat(ROUND(@IBPSize * @IBPDataPages / (1024*1024*1024) * 1.05, 2), ' GB' );
SELECT @IBPSize;
Run Code Online (Sandbox Code Playgroud)

IBPSize 的数字(以 GB 为单位)是更适合您的实际工作数据集的数字。

现在,如果 IBPSize 对于最大的 Amazon EC2 RAM 配置来说仍然太大,则将 75% 的 RAM 用于 Amazon EC2 数据库服务器。


Cra*_*ein 15

我提供此答案作为 Rolando 下面答案的补充信息。

在服务器投入生产之前

根据 MySQL 最常用的最大表计算 innodb_buffer_pool_size。要根据数据库中的大小识别最大的表,您可以使用以下脚本:

select table_schema, table_name, round(data_length/1024/1024,2) as size_mb 
from information_schema.tables where table_schema like 'my_database' 
order by size_mb desc;


+--------------+-------------------------+---------+
| table_schema | table_name              | size_mb |
+--------------+-------------------------+---------+
| heavybidder     | user                 |   522.55|
| heavybidder     | bid                  |   121.52|
| heavybidder     | item_for_sale        |    10.52|
| heavybidder     | account_user         |    5.02 |
| heavybidder     | txn_log              |    4.02 |
| heavybidder     | category             |    0.02 |
+--------------+-------------------------+---------+
Run Code Online (Sandbox Code Playgroud)

现在我们知道数据库中哪些表最大,我们需要确定哪些表是最常用的。为此,我将使用像 Jet Profiler (JP) 这样的分析程序来查看访问最多的表。JP 将向您显示哪些表被最频繁地访问。这是 JP 中该部分的屏幕截图

在此处输入图片说明

因此,考虑到这一点,我现在知道 user 和bid 表占用大约 640MB 的磁盘空间,根据 JP,它们非常频繁地使用,这意味着 MySQL 将把它们的索引和数据存储在缓冲池中作为 Rolando下面在他的评论中提到。

为了确保 MySQL 有足够的内存来存储我最大和最常用表的数据,然后我将 innodb_buffer_pool_size 定义为 640MB。

还有一些额外的注意事项,但它们不适用于 innodb_buffer_pool_size。

这是32位还是64位系统?在 32 位系统中,除非您激活 PAE,否则您将被限制为 4GB。在 Windows 中,这意味着运行 Windows Enterprise 或 Datacenter 版本。

系统上运行的其他进程需要多少内存?在专用的 MySQL 服务器上,我将为操作系统保留 5% 到 10%。在 Windows 中,您可以使用 Process Explorer 来分析内存使用情况。在 Linux 中,您有 sysstat、free、htop、top 和 vmstat。

数据库是仅由 Innodb 表组成还是由 Innodb 和 MyISAM 组成?如果是两者的混合,那么我会为 key_cache、join 变量、查询缓存等留出内存。你可以在服务器投入生产后计算你的 MyISAM 命中率。

服务器投入生产后

Innodb 目前的命中率是多少?

1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests)。

什么是密钥缓存命中率

1 - (Key_reads/Key_read_requests)

我通常会尽量使比率接近 100%。

您的桌子在缓冲池中的适应度如何

您还可以通过参考此链接查看您的表数据在您的 buffer_pool 中的匹配程度,该链接提供了一种显示“给定表 (cnt) 的缓冲池中有多少页,其中有多少页是脏的 (dirty)”的方法,以及索引适合内存的百分比是多少(fit_pct)。” 仅适用于 Percona 服务器

http://www.mysqlperformanceblog.com/2010/12/09/how-well-does-your-table-fits-in-innodb-buffer-pool/