严格地从MySQL的角度来看,我对如何改进MySQL实例的数据/索引缓存提出了一些建议。
请记住,MySQL有两个主要的存储引擎
它们的缓存机制不同。您可以根据自己选择的存储引擎进行调整。
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\\u buffer\\u大小。
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\\u buffer\\u大小。
预测如果您预测数据集将增长20倍,则此查询建议的值将增加20倍。假设您的MyISAM数据集是15MB,3MB是索引的总和。如果您估计将有20倍的数据,请在/etc/my中将key\\u buffer\\u大小设置为60MB。cnf:
[mysqld]
key_buffer_size=60M
然后重新启动MySQL。这同样适用于InnoDB缓冲池。
如果所有数据都是InnoDB,则需要执行full Cleanup of your InnoDB infrastructure which I posted in StackOverflow.