私があなたなら、すべてのデータをInnoDBに切り替えます。テーブルロック/行ロックについては、長い間多くの人が議論してきました。私は常にInnoDBを選択します。ただし、InnoDB ... CACHINGを選択するもう1つの大きな理由があります。
ほとんどの人はMyISAMの方が読み取りが高速であることを自慢していますが、ほとんどの人はMyISAMの多数のキャッシュ(key_buffer_sizeによって設定される)と呼ばれる、.MYIファイルからのインデックスページのみをキャッシュすることを忘れています。データページをキャッシュすることはありません。32ビットシステムでは公式に最大4GBです。64ビットの場合、最大8GBが最適です。
InnoDBバッファープールは、データとインデックスページをキャッシュします。使用しているサーバーに応じて、データセット全体をRAMにキャッシュできます。InnoDBを最大80%のRAMと10%のDB Conenctionsに調整し、10%をOSに残すことができます。これは、異なるオペレーティングシステムでも同じです。
素晴らしい成功を収めているDrupalのお客様にこれらをお勧めします。Wordpressにも同様に適用されます。WordPressを使用するクライアントにDBサポートを提供しました。同じ改善。
InnoDBのメモリは、MyISAMよりも効率的に構成できます。パフォーマンスのニーズに合わせてInnoDBを調整する方法は常にあります。データが大きくなるにつれて、最終的には要件になります。
UPDATE 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の場合、2つの変更を行います。
- 置き換える
WHERE engine IN ('InnoDB','MyISAM')
とWHERE engine='InnoDB'
- 置き換える
CONCAT('SELECT ',ndxcollist,' FROM ',
とCONCAT('SELECT * FROM ',
これにより、より多くのデータページがInnoDBバッファープールに追加されます。
最後の注意:InnoDBバッファープールがすべてのInnoDBデータを保持するのに十分な大きさであることを確認してください