Menyetel (dan memahami) table_cache di mySQL

18

Saya menjalankan script tuning kinerja MySQL yang sangat baik dan mulai bekerja melalui saran. Salah satu yang saya temui adalah

TABLE CACHE
Nilai table_cache saat ini = 4096 tabel Anda memiliki total 1073 tabel. Anda memiliki 3900 tabel terbuka. Table_cache hit rate saat ini adalah 2%, sementara 95% dari cache tabel Anda digunakan. Anda mungkin harus meningkatkan table_cache Anda

Saya mulai membaca table_cache tetapi menemukan dokumentasi MySQL kurang. Mereka mengatakan untuk meningkatkan table_cache, "jika Anda memiliki memori". Sayangnya table_cachevariabel didefinisikan sebagai "Jumlah tabel terbuka untuk semua utas."

Bagaimana memori yang digunakan oleh MySQL akan berubah, jika saya meningkatkan variabel ini? Apa nilai yang baik, untuk mengaturnya?

jotango
sumber

Jawaban:

16

Dari dokumentasi MySQL

Misalnya, untuk 200 koneksi yang berjalan bersamaan, Anda harus memiliki ukuran cache tabel setidaknya 200 × N, di mana N adalah jumlah maksimum tabel per gabung di salah satu kueri yang Anda jalankan. Anda juga harus memesan beberapa deskriptor file tambahan untuk tabel dan file sementara.

Jadi jika dalam aplikasi Anda, Anda memiliki kueri yang menggabungkan 4 tabel dan Anda ingin dapat menangani 200 koneksi bersamaan, berdasarkan pernyataan itu Anda harus memiliki table_cache minimal 800.

Sejauh penggunaan memori, saya tidak memiliki angka-angka itu, saya menduga itu akan tergantung pada ukuran tabel Anda yang di-cache.

ManiacZX
sumber
Terima kasih untuk penunjuknya. Saya agak takut meningkatkan nomor table_cache saya tanpa mengetahui bagaimana penggunaan RAM akan berubah. RAM mesin sudah penuh.
jotango
Apakah Anda yakin memori benar-benar habis atau hanya memori telah diambil oleh buffer / cache? Jalankan "free -m" dan lihat baris kedua (- / + buffer / cache), ini adalah representasi yang lebih akurat dari penggunaan memori Anda di mb. Lihat tanggapan di serverfault.com/questions/73189/… dan serverfault.com/questions/9442/…
ManiacZX
Ya, itu benar-benar menggunakan memori. Kemarin swap, yang benar-benar buruk untuk db produksi. Saya memesan upgrade RAM dari HP hari ini.
jotango
untuk yang datang ke sini sekarang, jawaban ini tidak akurat untuk mysql 5.1+. sekarang mengacu pada table_open_cacheketika Anda melihat dokumen. Lihat jawaban @MarkRs ketika melihattable_cache
Jason
3

Anda harus memantau variabel Opened_Tables dan melihat seberapa cepat itu meningkat. Jika secara signifikan lebih cepat daripada Anda membuat tabel baru (termasuk yang sementara), maka cache tabel Anda mungkin terlalu kecil.

Table_Cache harus selalu - yah sebagian besar - secara signifikan lebih besar dari jumlah total tabel di server. Kalau tidak, itu akan terus membuka dan menutup tabel.

Saya tidak bisa melihat bagaimana Anda bisa mendapatkan tingkat hit cache 2%, kecuali Anda mengukur waktu setelah server restart atau menggunakan FLUSH TABLES banyak (dalam kaitannya dengan jumlah pertanyaan). Biasanya hit rate cache tabel harus 99,9% jika tidak kinerja akan menyedot.

Jangan melakukan FLUSH TABLES jika Anda bisa menghindarinya, itu akan menghancurkan cache.

Tabel pembuka mahal karena perlu membaca file FRM. Dalam MyISAM secara signifikan lebih buruk (daripada mesin lain), seperti ketika menutup sebuah tabel, ia juga membuang semua blok di cache kunci yang berasal dari indeksnya. Jadi, menutup tabel akan membuang indeksnya dari cache kunci == tidak bagus! Mesin lain menyimpan blok yang di-cache tetapi masih perlu membaca ulang metadata dan mengalokasikan beberapa struktur.

MarkR
sumber