Siz olsaydım, tüm verileri InnoDB'ye geçirirdim. Masa kilitleme / sıra kilitleme uzun zamandır birçok kişi tarafından tartışılmıştır. Her zaman InnoDB eller aşağı seçin. Ancak, InnoDB ... CACHING'i seçmenin başka bir derin nedeni daha var .
Çoğu kişi MyISAM'ın okumalar için daha hızlı olduğunu söylese de, çoğu kişi MyISAM için anahtar önbellek (key_buffer_size tarafından ayarlanır) adı verilen birçok önbelleğin yalnızca .MYI dosyalarından dizin sayfalarını önbelleğe aldığını unutur. Veri sayfalarını asla önbelleğe almaz. 32-bit sistemlerde resmi maksimum 4GB'a sahiptir. 8GB, 64 bit için en iyi maksimum değerdir.
InnoDB Arabellek Havuzu veri ve dizin sayfalarını önbelleğe alır. Sahip olduğunuz sunucuya bağlı olarak, RAM'deki tüm veri kümesini önbelleğe alabilirsiniz. InnoDB'yi DB Bağlantıları için% 80 ve% 10'a kadar ayarlayabilir ve işletim sistemi için% 10 bırakabilirsiniz. Bu, farklı işletim sistemleri için bile geçerlidir .
Bunları harika bir başarı ile Drupal müşterileri için tavsiye ettim . Wordpress için de geçerlidir . WordPress kullanan istemciler için DB desteği sağladım. Aynı gelişmeler.
InnoDB için belleği her zaman daha fazla MyISAM yapabileceğinizden daha etkili bir şekilde yapılandırabilirsiniz . InnoDB'yi performans gereksinimlerinize uygun hale getirmenin her zaman bir yolu vardır . Verileriniz büyüdükçe, sonunda bir gereklilik haline gelecektir .
GÜNCELLEME 2011-11-21 11:44 EST
Tam veri kümeniz yeterince küçükse, mysql başladıktan hemen sonra sahip olduğunuz her tabloda bir SELECT sorgusu yürütebilirsiniz.
InnoDB ve / veya MyISAM olan tüm tablolar için şu sorguyu çalıştırın:
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
;
Bu, çalıştırılması gereken tüm olası SELECT sorgusunun çıktısını alır ve başvurulan tüm dizinleri toplar. Bu sorguyu /root/MakeSelectQueriesToLoad.sql adlı bir dosyaya yerleştirin. Komut dosyasını çalıştırın ve /root/SelectQueriesToLoad.sql çıktısını toplayın. Son olarak, çalıştırın:
mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql
Bu kesinlikle tüm dizin sayfalarını InnoDB Arabellek Havuzu ve MyISAM Anahtar Önbelleğine önceden yükleyecektir. Tüm verileriniz InnoDB ise, iki değişiklik yapın:
- yerine
WHERE engine IN ('InnoDB','MyISAM')
sahipWHERE engine='InnoDB'
- yerine
CONCAT('SELECT ',ndxcollist,' FROM ',
sahipCONCAT('SELECT * FROM ',
Bu aynı zamanda daha fazla veri sayfasını InnoDB Arabellek Havuzu'na yerleştirir.
NİHAİ NOT: InnoDB Arabellek Havuzunun tüm InnoDB Verilerinizi tutacak kadar büyük olduğundan emin olun