Tabel apa yang harus atau dapat dimigrasikan ke InnoDB, dan mana yang harus tetap MyISAM?


10

Sesuai judul: Apakah ada daftar kandidat untuk tabel yang akan dimigrasi ke InnoDB? Dan apa yang harus tetap MyISAM.

Beberapa informasi tambahan

  • Situs ini memiliki beban baca yang cukup berat, tetapi menyisipkan sekitar 10 node per jam, dengan tag dan semacamnya.
  • Kami banyak menggunakan CCK (sejumlah besar tabel yang dinormalisasi dalam bentuk content_field%).
  • Kami juga menggunakan Tampilan untuk tentang semua blok dan halaman kami; tetapi banyak dari mereka adalah kandidat untuk penggantian dengan modul khusus (untuk mengurangi permintaan basis data dan beratnya permintaan itu).
  • Pengguna semuanya anonim; dengan pengecualian beberapa editor dan webmaster yang masuk.

Ini lucu seluruh internet tidak tahu bagaimana sebenarnya menjawab pertanyaan ini. Tabel Drupal mana yang paling banyak ditulis, dan dikunci .... siapa tahu.
JM Becker

Jawaban:


8

Anda harus mengonversi semua data ke InnoDB untuk mencegah masalah penguncian tabel. Namun, ada beberapa hal yang perlu dipikirkan:

Pengindeksan FULLTEXT

Saat ini, hanya MyISAM yang mendukung pengindeksan FULLTEXT. Pengindeksan FULLTEXT untuk InnoDB saat ini sedang dalam proses untuk MySQL 5.6 tetapi belum siap-produksi . Jika Anda memiliki tabel Drupal yang memiliki indeks FULLTEXT, mereka tidak dapat dikonversi ke InnoDB saat ini.

UPDATE pada Pengindeksan FULLTEXT

MySQL 5.6 sekarang GA (keluar untuk Penggunaan Produksi). Silakan coba pengindeksan FULLTEXT di InnoDB.

Untuk menemukan tabel yang memiliki FULLTEXTindeks, jalankan kueri ini:

SELECT table_schema,table_name
FROM information_schema.statistics
WHERE index_type='FULLTEXT';

Jika tidak ada baris yang kembali, konversikan semua tabel InnoDB ke isi hati Anda. Saya menulis posting sebelumnya tentang cara mengkonversi semua tabel MyISAM ke InnoDB hanya menggunakan mysql .

Replikasi MySQL

Jika Anda memiliki lingkungan baca-berat, membaca dapat berjalan lebih cepat di MyISAM jika Anda melakukan hal berikut:

  • Setup Master / Replikasi Budak
  • Buat satu atau lebih Baca Budak di bawah Master
  • Tambahkan --skip-innodb/etc/my.cnf di semua Budak (mengkonversi tabel ke MyISAM saat memuat data ke dalam Budak)
  • Ubah format baris semua tabel MyISAM pada setiap Budak menjadi TETAP dengan perintah ini: ALTER TABLE tblname ROW_FORMAT=FIXED;
  • Saya memposting sesuatu di DBA StackExchange ini
  • Buku Desain dan Tuning Database MySQL merekomendasikan penggunaan ROW_FORMAT=FIXEDdi halaman 72,73. Ini akan secara internal mengonversi semua bidang VARCHAR ke CHAR. Ini akan membuat tabel MyISAM lebih besar, tetapi mengeksekusi SELECTs terhadapnya akan jauh lebih cepat. Saya pribadi bisa membuktikan hal ini. Saya pernah punya meja yang 1.9GB. Saya mengubah format dengan ALTER TABLE tblname ROW_FORMAT=FIXED. Tabel berakhir 3.7GB. Kecepatan SELECT terhadapnya adalah 20-25% lebih cepat tanpa memperbaiki atau mengubah apa pun.

Satu-satunya sakit kepala dengan ini adalah membuat aplikasi Anda mengetahui tentang slave baca yang terpisah.

EPILOG

Jika Anda melihat manfaat lain yang dimiliki masing-masing mesin penyimpanan, periksa DBA StackExchange:


4

Karena situs web Anda berada di sisi baca-berat, saya cukup mengkonversi semua tabel ke InnoDB. Anda kemudian dapat mengoptimalkan kinerja baca dengan mengukur ukuran buffer InnoDB dan cache kueri dengan tepat. Dengan cara ini, kami mencapai beberapa ribu permintaan per detik pada server database khusus dalam infrastruktur hosting Drupal kami.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.