我的托管服务提供商给我提出了建议,指出生产服务器管理的一般规则是确保数据库服务器上的内存大于整个数据库的大小。
我们的数据库有 1800MB(并且还在增长),我们被告知要购买一台 2GB 的服务器。这让我很不舒服,但我不是生产服务器管理方面的专家。我们正在运行一个 MySQL 数据库,其中大部分是 InnoDB 表和一些 MyISAM。
谢谢!
答案1
由于您使用的是 MySQL,因此您需要测量两个存储引擎的内存
- 数据库引擎InnoDB
- 数据库管理系统
每个存储引擎都有不同的缓存特性。我于 2011 年 4 月 14 日在 DBA StackExchange 上写过这篇文章。
数据库引擎InnoDB
InnoDB 会将数据和索引页缓存到其缓冲池中
此查询将告诉您理想的尺寸innodb_buffer_pool_size在英国
SELECT SUM(data_length+index_length)/POWER(1024,3) RecommendedBufferPoolSize
FROM information_schema.tables WHERE engine='InnoDB';
我也会确保 InnoDB 使用 innodb_file_per_table。
数据库管理系统
MyISAM 会将索引页缓存到其 Key Cache 中
此查询将告诉您理想的尺寸密钥缓冲区大小
SELECT SUM(index_length)/POWER(1024,3) RecommendedKeyBufferSize
FROM information_schema.tables WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','performance_schema','mysql');
将这两个数字相加并乘以 1.1(以容纳数据库连接、排序、读取、连接的缓冲区)。这应该是所需的 RAM 量。在许多情况下,内存中可能容纳的数据太多了。
根据经验,如果您拥有所有 InnoDB 数据,那么 innodb_buffer_pool_size 不应超过已安装 RAM 的 80%(我更喜欢 75%)。
从这里开始我建议你使用常识。仅仅因为你有 10G 的 InnoDB 数据和索引并不意味着它们全部都存储在 RAM 中,当然,除非你使用每个 InnoDB 表和每个 InnoDB 索引在所有表上运行每个 SELECT。
在您的情况下,如果您不知道最初将使用哪种存储引擎,或者数据量远远超过安装的 RAM,我只会为 InnoDB 使用 65% 的 RAM,为 MyISAM 使用 10% 的 RAM。