Saya telah melihat orang menggunakan perbandingan Open_tables dan Opened_tables untuk menilai apakah table_cache terlalu kecil di MySQL. Namun, saya percaya bahwa Opened_tables bersifat kumulatif di waktu aktif, jadi ini bukan perbandingan yang valid. Satu-satunya peringatan yang mungkin Opened_tables hanya menabrak merindukan - meskipun itupun jika tabel yang dibuka per detik masih kecil, itu mungkin tidak masalah untuk itu tumbuh secara bertahap.
Jika membandingkan Open_tables dengan Opened_tables tidak valid, apakah ada cara lain untuk mendapatkan data yang diukur untuk ini?
Ini ada di MySQL 5.0, tetapi perbedaan antar versi juga diterima.
mysql
database-tuning
configuration
Sam Brightman
sumber
sumber
Jawaban:
Alasan terbesar untuk memiliki table_cache besar adalah agar LOCK_open mutex tidak panas. MySQL sebelum 5.5 memiliki banyak pertentangan ketika Anda mencoba untuk membuka / menutup tabel, jadi Anda ingin membatasi melakukan ini sebanyak mungkin, yaitu memiliki cache tabel yang besar.
Jadi Anda tidak peduli dengan rasio hit dan miss (infact, Anda harus mengabaikan rasio sama sekali - posting blog ini menjelaskan alasannya ). Yang Anda pedulikan adalah tingkat kesalahan , karena semakin sering ini terjadi per detik, semakin tinggi kemungkinan Anda akan memiliki pertengkaran (satu utas harus menunggu utas lainnya untuk melepaskan kunci.)
Bagaimana Anda mengetahui tingkat kesalahan? Anda mengambil beberapa sampel Opened_Tables terpisah beberapa detik selama periode tersibuk hari itu, dan jika ada peningkatan dalam setiap sampel, mungkin ide yang baik untuk melihat apakah Anda dapat meningkatkan table_cache.
Catatan: Saya sangat tidak merekomendasikan membandingkan dengan uptime.
sumber
Pertama, mari kita pertimbangkan variabel status tersebut:
Buka tabel : Jumlah tabel yang terbuka.
Opened_tables : Jumlah tabel yang telah dibuka. Jika Opened_tables besar, nilai table_open_cache Anda mungkin terlalu kecil.
Anehnya, jawaban atas pertanyaan Anda ada di dalam pertanyaan itu sendiri.
Dua variabel hanya akan lebih masuk akal jika Anda melemparkan satu variabel status lagi ke dalam campuran: Uptime (atau Uptime_since_flush status untuk rata-rata baru setelah FLUSH STATUS ).
Anda harus membandingkan Open_tables agsinst (Opened_tables / Uptime) . Jika Open_tables naik di atas (Opened_tables / Uptime) , sekarang Anda memiliki alasan untuk khawatir dan harus tetap terbuka untuk hal-hal seperti berikut:
UPDATE 2011-08-31 12:18 EDT
Harap perhatikan mengapa saya juga menyarankan menggunakan Uptime_since_flush_status daripada Uptime untuk mendapatkan perbaikan pola pertumbuhan Opened_tables untuk periode tertentu.
Misalnya, jika Anda menjalankan
FLUSH STATUS;
setiap Senin di tengah malam, Anda dapat menghasilkan OpenTableFactor:Faktor tabel terbuka ini sama dengan jumlah yang mewakili jumlah tabel terbuka pada saat tertentu terhadap jumlah rata-rata tabel terbuka selama periode tertentu. Dengan
FLUSH HOSTS;
setiap minggu / hari / tuan rumah, rata-rata itu bertentangan dengan minggu / hari / jam.Berikut adalah contoh dari salah satu klien majikan saya:
Klien ini biasanya memelihara sekitar 7745 OpenTableFactor pada maks. Jika OpenTableFactor turun tiba-tiba (bahkan jika sedikit), itu bisa menunjukkan pola lalu lintas yang lebih rendah, conenctions yang dibatalkan tinggi, dan sebagainya. Jika OpenTableFactor tidak pernah berubah (walaupun sedikit), ini dapat memberi Anda kesempatan untuk mengubah pengaturan ini:
Setelah disesuaikan, OpenTableFactor dapat berubah secara konstan atau mengenai plafon atau dataran tinggi lainnya. Dengan demikian, menggunakan unit yang berbeda dalam variabel status menjadi vital untuk jenis penyetelan ini.
UPDATE 2011-08-31 12:42 EDT
Permintaan SQL yang saya jalankan untuk OpenTableFactor tidak berfungsi untuk MySQL 5.0 dan kembali. Jika Anda menggunakan MySQL Administrator atau MONyog , Anda bisa menyesuaikan grafik menggunakan rumus dalam kueri dan monitor. MONyog mengumpulkan sejarah menggunakan SQLLite untuk grafik historis selanjutnya. Ini dapat dilakukan untuk semua versi MySQL.
sumber
Dari salah satu komentar pengguna di halaman dokumentasi table_cache :
Berarti itu bertambah ketika Anda melampaui
table_cache
nilai Anda . Jadi cara saya biasanya memeriksa ini adalah untuk membandingkanopened_tables
denganuptime
, tetapi kuncinya di sini adalah untuk mengambilnya pada interval yang ditetapkan (misalnya per menit selama sepuluh menit, misalnya). Jika meningkat mungkin indikasi Anda perlu meningkatkantable_cache
.Beberapa peringatan untuk menyebutkan:
Komentar lain dalam dokumentasi di atas: "Variabel status 'Opened_tables' juga akan bertambah 2 setiap kali Anda membuat tabel sementara." Jadi jika pertanyaan Anda membutuhkan banyak tabel sementara, ini bisa menjadi penyebab peningkatan yang cepat
opened_tables
. Anda dapat melihat penggunaan tabel sementara Anda menggunakan kueri berikut:SHOW GLOBAL STATUS LIKE '%tmp%';
Jangan menambah table_cache juga tinggi
sumber