Kami mengalami masalah setelah memindahkan basis data pelanggan kami ke server tambahan. Ini seharusnya memiliki efek positif pada kinerja situs, tetapi ada masalah dengan penguncian tabel di MyISAM. (Saya pernah mendengar menggunakan InnoDB bukan MyISAM, tetapi kami tidak dapat mengganti mesin dalam waktu dekat).
Kami dapat menemukannya pada kueri pembaruan yang dilakukan ketika moderator mengaktifkan komentar pada artikel tersebut. Inilah prosesnya:
- pembaruan-permintaan diproses
SET status = 1 WHERE id = 5
(indeks diatur) - file halaman yang di-cache dihapus
Pada titik ini seluruh halaman menjadi lambat. Basis data sendiri sibuk selama beberapa menit. Saya mengambil daftar proses beberapa kali dan melihat sekitar 60 entri dari kueri pemilihan yang berbeda, yang semuanya dalam keadaan menunggu kunci tingkat tabel .
1. Saya tidak mengerti mengapa pembaruan ini di atas meja article_comments
dapat memengaruhi pernyataan pilih untuk tabel article
untuk menunggu kunci level tabel. Dalam daftar proses, hampir semua permintaan menunggu berasal dari tabel ini. Saya telah membaca tentang fakta bahwa pembaruan / sisipan lebih disukai untuk dipilih dan bahwa ini dapat menyebabkan masalah seperti itu, tetapi tabel artikel itu sendiri tidak diperbarui ketika komentar menjadi aktif, sehingga pilihan tidak harus menunggu. Apakah saya salah mengerti?
2. Apakah ada sesuatu selain beralih ke InnoDB untuk mencegah perilaku ini atau setidaknya untuk mendapatkan keseimbangan yang lebih baik? Saya sangat jengkel tentang kenyataan bahwa masalah ini tidak muncul sebelum memindahkan database ke server baru. Saya kira ada beberapa kesalahan konfigurasi tetapi saya tidak tahu cara mengidentifikasi.
key_buffer_size
diatur untuk1GB
. Meningkatkan itu untuk10GB
mengurangi masalah.Jawaban:
MyISAM Storage Engine sangat terkenal karena melakukan kunci tabel penuh untuk setiap DML (INSERT, UPDATE, DELETEs). InnoDB pasti akan mengatasi masalah itu dalam jangka panjang.
Saya menulis tentang pro dan kontra menggunakan MyISAM vs InnoDB
Sehubungan dengan pertanyaan Anda saat ini, berikut adalah skenario yang mungkin:
article
danarticle_comments
keduanya adalah tabel MyISAMarticle_comments
memiliki satu atau lebih indeks denganstatus
sebagai kolomarticle_comments
-cache dalam Buffer Kunci MyISAM (berukuran oleh key_buffer_size ), menyebabkan halaman indeks lama keluar dari Buffer Kunci MyISAMarticle
danarticle_comments
Dalam skenario yang saya sarankan, SELECT terhadap
article
tabel dapat ditunda untuk mengizinkan penulisan karena harus menunggu untukarticle_comments
bebas dari DML apa pun (dalam hal ini, anUPDATE
)sumber
Baunya seperti kamu punya Query_cache besar?
Untuk sistem produksi dengan banyak penulisan, Anda juga dapat mematikan MATI query_cache.
Semua entri dalam query_cache untuk tabel yang diberikan dibersihkan ketika setiap penulisan terjadi pada tabel itu. Semakin besar QC, semakin lambat tugas ini.
MyISAM menggunakan kunci "level tabel". Membaca dan menulis tidak dapat terjadi secara bersamaan (di tabel yang sama). Mentah, tetapi efektif.
sumber