Mengapa MySQL membuat banyak tabel sementara pada disk?

13

Dapatkah kesalahan konfigurasi menyebabkan terlalu banyak membuat tabel temp oleh mysql..mysql menunjukkan tuner

Current max_heap_table_size = 200 M
Current tmp_table_size = 200 M
Of 17158 temp tables, 30% were created on disk

table_open_cache = 125 tables
table_definition_cache = 256 tables
You have a total of 97 tables
You have 125 open tables.
Current table_cache hit rate is 3%

Tabel temp sebelumnya adalah "dari 23725 tabel temp 38% dibuat pada disk" tetapi saya mengubah max_heap dan tmp_table menjadi 200m dari 16m dan diturunkan menjadi 30% ..

Konfigurasi:

engine myisam 
group_concat_max_len = 32768
key_buffer_size = 3.7 GB,
thread_stack = 256k,
table_cache = 125
query_cache_limit = 1M
query_cache_size = 16M
join_buffer_size = 2.00 M
max_connections = 800

Sistem lain dengan konfigurasi default menunjukkan "dari 23725 tabel temp, 1% dibuat pada disk" dengan database yang sama.

Saya mencoba mengubah ke default pada mesin dengan masalah ini dan masih menunjukkan "Dari 580 tabel temp, 16% dibuat pada disk".

Saya menggunakan Ubuntu 11,4 64 bit dengan 48 gb ram. Adakah yang bisa menyarankan solusi?

Akankah mengubah mesin db dari "myisam" menjadi "memory" pada tabel menggunakan "group by" memperbaikinya? Sebagaimana dijelaskan di sini: http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caus-by-on-disk-turnal-tables/

ananthan.nair
sumber

Jawaban:

16

mysqltuner jarang memberikan informasi yang berguna. Sebagian besar menggunakan statistik yang tidak relevan tentang "hit rate" dan memberikan batasan sewenang-wenang pada jumlah widget yang dapat diterima. Jika Anda tidak menghadapi masalah kinerja, maka Anda sebenarnya tidak perlu menyelesaikan masalah yang dihadirkan kepada Anda. Yang sedang berkata, inilah sedikit informasi latar belakang tentang tabel sementara ...

MySQL secara internal menggunakan mesin penyimpanan MEMORY untuk membuat tabel sementara implisit. Pada tabel sementara disk menggunakan mesin penyimpanan MyISAM.

Tabel sementara dibuat di disk saat:

  • Bidang TEKS atau BLOB hadir (karena MEMORY tidak mendukung jenis ini)
  • ukuran tabel sementara implisit yang dihasilkan melebihi yang lebih kecil dari tmp_table_sizeataumax_heap_table_size
  • Jika kolom dengan lebih dari 512 byte digunakan dengan GROUP BY atau UNION atau ORDER BY

Baca Dokumentasi MySQL pada Tabel Sementara Internal untuk detail lebih lanjut.

Apa yang dapat Anda lakukan tentang ini? Menganggap bahwa itu sebenarnya mewakili masalah kinerja (bukan hanya mengganggu Anda secara intelektual):

  • Hindari bidang TEKS / BLOB dan sebaliknya gunakan bidang VARCHAR atau CHAR berukuran tepat jika memungkinkan.
  • Jika TEXT / BLOB tidak dapat dihindari, buat mereka untuk tabel terpisah dengan hubungan kunci asing dan GABUNG hanya ketika Anda membutuhkannya.
  • Perlakukan kolom besar, lebih dari 512 byte seperti yang Anda lakukan pada bidang TEXT / BLOB yang disebutkan di atas.
  • Pastikan pertanyaan Anda mengembalikan hanya set hasil yang Anda butuhkan (klausa WHERE selektif yang tepat, hindari SELECT *)
  • Hindari subkueri dan gantikan dengan gabungan, terutama jika mereka mengembalikan set hasil yang besar
  • Pilihan terakhir - tingkatkan keduanya tmp_table_sizedan max_heap_table_size. Jangan lakukan ini kecuali jika Anda menemukan bahwa pertanyaan Anda tidak dapat dioptimalkan.

Jika Anda khawatir tentang konfigurasi MySQL Anda dan merasa tidak nyaman dengan pengaturan yang tersedia sendiri, Anda mungkin ingin memeriksa Wisaya Konfigurasi Percona sebagai titik awal.

Akankah mengubah mesin db dari "myisam" menjadi "memory" pada tabel menggunakan "group by" memperbaikinya? seperti yang dijelaskan di sini

Tidak, itu tidak akan dan itu akan membuat tabel Anda tidak pernah bertahan ke disk. Jangan lakukan ini.

Aaron Brown
sumber
+1, tetapi menambahkan bahwa ini adalah yang lebih rendah dari tmp_table_sizeataumax_heap_table_size
Derek Downey
Rekomendasi terbaik oleh mysqltuner adalah mengaktifkan log permintaan lambat. Ini akan membantu Anda mengidentifikasi permintaan lambat jika ada.
fat_mike
2

"menggunakan sementara" dan "menggunakan filesort" bukan akhir dari dunia!

PILIH ... GROUP BY a, b ORDER BY c, d - Membutuhkan 1 atau 2 "temp tables".

Ada beberapa saat ketika pertanyaan Anda akan menggunakan tabel temp. Tabel temp dapat memperlambat kueri dengan faktor kecil. Tetapi jika kueri masih "cukup cepat" maka jangan khawatir.

Jika kueri terlalu lambat (dengan atau tanpa tabel tmp), mari kita bahas. Berikan SHOW CREATE TABLE, SHOW TABLE STATUS, dan EXPLAIN.

Rick James
sumber
1
Jika Anda memiliki indeks (a, b, c, d), tidak akan ada tabel temp.
Yvan