设置innodb_buffer_pool是什么,为什么?


20

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

我必须重新调整innodb_buffer_pool大小才能获得更好的性能.InnoDB表的最大表大小(Index + data)为28GB。

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

更新

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

每个表的文件已启用。

我正在使用Linux机器。


未由其他进程使用的计算机上的可用RAM是多少?您在使用Windows,Linux还是其他工具?您正在使用哪个版本的MySQL?为什么将表大小限制为28GB?
Craig Efrein 2012年

表的大小是不是limited..I给表的规模高达time.it的一个点会增加,因为会有镶在未来..
阿卜杜勒Manaf

Answers:


25

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

给定当前已加载到当前数据库服务器的InnoDB缓冲池中的数据集,这是一种更精细的方法来确定新数据库服务器的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

运行公式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;

如果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;

IBPSize的数字(以GB为单位)是最接近您实际工作数据集的数字。

现在,如果IBPSize对于最大的Amazon EC2 RAM Config来说仍然太大,则将75%的RAM用于Amazon EC2 DB Server。


那真的是非常有用的信息。我还需要了解MySQL Server如何在缓冲池中加载数据和索引,我已经阅读了文档并得到了它使用LRU的信息,但是如何将它们加载到内存中(例如,如果我有2GB的存储空间)缓冲池,但查询中请求的表大小远不止于此。
Abdul Manaf 2012年

仅将满足查询所需的数据和索引页加载到缓冲池中,而不是整个表中。旧的数据和索引页是基于上市LRU算法旋转出dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html
RolandoMySQLDBA

阿卜杜勒(Abdul),您应该选择罗兰多(Rolando)的答案,它的回答比我的回答要好。我要重写自己的答案,只是因为我需要更加清楚。
Craig Efrein 2012年

13

我提供此答案是对以下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 |
+--------------+-------------------------+---------+

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

在此处输入图片说明

因此,考虑到这一点,我现在知道用户表和出价表大约占用640MB的磁盘空间,根据JP来说,它们非常常用,这意味着MySQL将以Rolando的形式将其索引和数据存储在缓冲池中在他的评论中提到以下内容。

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

还有一些其他注意事项,但它们不适用于innodb_buffer_pool_size。

这是32位还是64位系统?在32Bit系统中,除非激活PAE,否则您只能使用4GB。在Windows中,这意味着运行Windows Enterprise或Datacenter版本。

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

数据库是仅由Innodb表组成还是由Innodb和MyISAM的混合物组成?如果是两者的混合,那么我将为key_cache,联接变量,查询缓存等留出内存。服务器投入生产后,您可以稍后计算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/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.