SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;
您需要考虑将用于项目的存储引擎,因为 MySQL 对每个存储引擎的缓存不同。
MyISAM 只缓存索引页。InnoDB 缓存数据和索引页。
鉴于您有一个包含大 ID 的表,我希望您使用的是 MyISAM。
这是一个帮助您确定最佳 key_buffer_size 的查询:
这将为 MyISAM 密钥缓存 (key_buffer_size) 提供给定您当前数据集的推荐设置(查询将建议上限为 4G (4096M)。对于 32 位操作系统,4GB 是限制。对于 64 位,8GB。
更新 2011-09-16 14:49 EDT
如果您使用的是 InnoDB,调整 key_buffer_size 的大小将无济于事。InnoDB 和 MyISAM 缓存不同。
这是用于调整 InnoDB 缓冲池大小的同类查询: