Jika saya jadi Anda, saya akan mengalihkan semua data ke InnoDB. Penguncian meja / penguncian baris telah lama dibahas oleh banyak orang. Saya akan selalu memilih InnoDB tangan ke bawah. Namun, ada alasan mendalam lainnya untuk memilih InnoDB ... CACHING .
Sementara kebanyakan orang menyombongkan bahwa MyISAM lebih cepat untuk dibaca, kebanyakan orang lupa bahwa banyak cache untuk MyISAM, yang disebut cache kunci (ditetapkan oleh key_buffer_size), hanya cache halaman indeks dari file .MYI. Itu tidak pernah cache halaman data. Ini memiliki maksimum resmi 4GB dalam Sistem 32-bit. 8GB maksimum terbaik untuk 64-bit.
Pool Buffer InnoDB menyimpan data dan halaman indeks. Bergantung pada server yang Anda miliki, Anda dapat menyimpan cache hingga seluruh dataset dalam RAM. Anda dapat menyetel InnoDB hingga 80% RAM dan 10% untuk DB Conenctions, dan biarkan 10% untuk OS. Ini berlaku bahkan untuk sistem operasi yang berbeda .
Saya telah merekomendasikan hal-hal ini untuk pelanggan Drupal dengan kesuksesan luar biasa. Ini berlaku untuk Wordpress juga. Saya telah memberikan dukungan DB untuk klien dengan WordPress. Perbaikan yang sama.
Anda selalu dapat mengonfigurasi memori untuk InnoDB lebih efektif sehingga Anda dapat lebih banyak MyISAM. Selalu ada cara untuk mengubah InnoDB agar sesuai dengan kebutuhan kinerja Anda . Saat data Anda tumbuh, pada akhirnya akan menjadi persyaratan .
UPDATE 2011-11-21 11:44 EST
Jika dataset lengkap Anda cukup kecil, Anda bisa menjalankan kueri SELECT pada setiap tabel yang Anda miliki tepat setelah mysql dimulai.
Untuk semua tabel yang merupakan InnoDB dan / atau MyISAM, jalankan kueri ini:
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
;
Ini akan menampilkan setiap permintaan SELECT yang mungkin Anda perlukan untuk menjalankan yang akan memanggil semua indeks yang akan direferensikan. Tempatkan kueri ini dalam file bernama /root/MakeSelectQueriesToLoad.sql. Jalankan skrip dan kumpulkan output /root/SelectQueriesToLoad.sql. Akhirnya, jalankan:
mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql
Ini pasti akan memuat semua halaman indeks ke dalam Pool Buffer InnoDB dan Cache Kunci MyISAM. Jika semua data Anda adalah InnoDB, buat dua perubahan:
- ganti
WHERE engine IN ('InnoDB','MyISAM')
denganWHERE engine='InnoDB'
- ganti
CONCAT('SELECT ',ndxcollist,' FROM ',
denganCONCAT('SELECT * FROM ',
Ini juga akan mengisi lebih banyak halaman data ke dalam Pool Buffer InnoDB.
CATATAN FINAL: Pastikan Pool Buffer InnoDB cukup besar untuk menampung semua Data InnoDB Anda