如果我是你,我会将所有数据切换到InnoDB。表锁定/行锁定早已被许多人讨论。我总是会选择InnoDB。但是,选择InnoDB ... CACHING还有另一个深刻的原因。
虽然大多数人吹嘘MyISAM的读取速度更快,但大多数人却忘记了MyISAM的许多缓存(称为密钥缓存(由key_buffer_size设置))仅缓存.MYI文件中的索引页。它从不缓存数据页。在32位系统中,它的官方最大容量为4GB。对于64位,最大最大为8GB。
InnoDB缓冲池缓存数据和索引页。根据您拥有的服务器,您可以在RAM中最多缓存整个数据集。您可以为InnoDB调整最多80%的RAM,为DB Conenctions调整10%的空间,为OS保留10%的空间。即使对于不同的操作系统也是如此。
我已经为Drupal客户推荐了这些东西,并取得了巨大的成功。它也适用于Wordpress。我已经为使用WordPress的客户端提供了数据库支持。同样的改进。
您始终可以更有效地为InnoDB配置内存,从而可以配置更多MyISAM。总有一种方法可以满足您的性能需求。随着数据的增长,最终将成为一种需求。
更新2011-11-21 11:44 EST
如果您的完整数据集足够小,则可以在mysql启动后立即对每个表执行SELECT查询。
对于所有InnoDB和/或MyISAM表,请运行以下查询:
SELECT DISTINCT
CONCAT('SELECT ',ndxcollist,' FROM ',
db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
SELECT
engine,table_schema db,table_name tb,index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
FROM (
SELECT
B.engine,A.table_schema,A.table_name,
A.index_name,A.column_name,A.seq_in_index
FROM
information_schema.statistics A INNER JOIN
(SELECT engine,table_schema,table_name
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')) B
USING (table_schema,table_name)
WHERE
B.table_schema NOT IN ('information_schema','mysql')
AND A.index_type <> 'FULLTEXT'
ORDER BY
table_schema,table_name,index_name,seq_in_index
) A
GROUP BY
table_schema,table_name,index_name
) AA
ORDER BY
engine DESC,db,tb
;
这将输出您需要运行的所有可能的SELECT查询,该查询将召唤所有要引用的索引。将此查询放在一个名为/root/MakeSelectQueriesToLoad.sql的文件中。运行脚本并收集输出/root/SelectQueriesToLoad.sql。最后,运行它:
mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql
这肯定会将所有索引页预加载到InnoDB缓冲池和MyISAM密钥缓存中。如果您所有的数据都是InnoDB,请进行两项更改:
- 替换
WHERE engine IN ('InnoDB','MyISAM')
为WHERE engine='InnoDB'
- 替换
CONCAT('SELECT ',ndxcollist,' FROM ',
为CONCAT('SELECT * FROM ',
这还将把更多数据页面填充到InnoDB缓冲池中。
最后提示:确保InnoDB缓冲池足够大,可以容纳所有InnoDB数据