我有170GB的InnoDB
索引和数据。
我必须重新调整innodb_buffer_pool大小才能获得更好的性能.InnoDB表的最大表大小(Index + data)为28GB。
那么innodb_buffer_pool的最佳大小应该是多少。
更新
我们将要将此本地数据库迁移到ec2,因此将根据innodb的当前统计信息设置RAM,这就是为什么我需要缓冲池的大小,以便在那里可以有可用RAM的原因。
每个表的文件已启用。
我正在使用Linux机器。
我有170GB的InnoDB
索引和数据。
我必须重新调整innodb_buffer_pool大小才能获得更好的性能.InnoDB表的最大表大小(Index + data)为28GB。
那么innodb_buffer_pool的最佳大小应该是多少。
更新
我们将要将此本地数据库迁移到ec2,因此将根据innodb的当前统计信息设置RAM,这就是为什么我需要缓冲池的大小,以便在那里可以有可用RAM的原因。
每个表的文件已启用。
我正在使用Linux机器。
Answers:
您拥有的最大表格占总数据的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。
我提供此答案是对以下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/