我有 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/
归档时间: |
|
查看次数: |
31989 次 |
最近记录: |