严格从MySQL的观点出发,我对如何改善MySQL实例的数据/索引缓存提出了一些建议。
请记住,有两个主要的MySQL存储引擎
它们的缓存机制是不同的。您可以根据自己的选择调整存储引擎。
我的ISAM
MyISAM仅缓存索引页。它从不缓存数据。您可以做两件事来改善MyISAM表的I / O。
MyISAM改进#1
任何具有VARCHAR列的MyISAM表都可以在内部转换为CHAR,而无需涉及初始设计。假设您有一个名为mydb.mytable的表,并且想要为其改进I / O,请对其执行以下操作:
ALTER TABLE mydb.mytable ROW_FORMAT=Fixed;
这将使表的大小增加60%-100%,但在不更改其他任何内容的情况下,I / O的性能将提高20-30%。我之前在DBA StackExchange中写道:
MyISAM改进#2
您需要增加MyISAM密钥缓存(按key_buffer_size的大小)。运行此查询,请:
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','performance_schema')) AA ) A,
(SELECT 2 PowerOf1024) B;
这将为您显示基于当前数据集的理想key_buffer_size。
创新数据库
InnoDB缓存数据和索引。如果您将所有数据转换为InnoDB,并且当前正在从所有InnoDB数据库运行WordPress,则需要调整InnoDB缓冲池的大小(使用innodb_buffer_pool_size进行调整)。运行此查询,请:
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;
这将为您显示基于当前数据集的理想key_buffer_size。
投影
如果您预测数据集将增长20倍,那么此查询所建议的结果将是20倍。假设MyISAM数据集为15MB,索引总和为3MB。如果您估计将有20倍的数据,请在/etc/my.cnf中将key_buffer_size设置为60MB:
[mysqld]
key_buffer_size=60M
然后重启MySQL。同样的事情也适用于InnoDB缓冲池。
如果您所有的数据都是InnoDB,则需要对我在StackOverflow中发布的InnoDB基础结构执行完整清理。