Saya membaca dari file konfigurasi sampel yang mengatakan sebagai berikut:
# Sort buffer is used to perform sorts for some ORDER BY and GROUP BY
# queries. If sorted data does not fit into the sort buffer, a disk
# based merge sort is used instead - See the "Sort_merge_passes"
# status variable. Allocated per thread if sort is needed.
Saya punya beberapa pertanyaan yang menggunakan filesort. Bagaimana cara menentukan ukuran buffer yang saya perlukan agar query dapat berjalan dengan lancar tanpa mengenai disk?
Jawaban:
Hanya ada satu variabel status yang peduli tentang sort_buffer_size . Itulah yang Anda miliki dalam pesan di pertanyaan: Sort_merge_passes . Dokumentasi MySQL mengatakan:
Harap diingat satu hal tentang sort_buffer_size
Meskipun meningkatkan
sort_buffer_size
dapat membantu kueri denganGROUP BY
s danORDER BY
s, Anda lebih baik meningkatkan kueri yang dapat Anda tingkatkan dan menambahkan indeks yang dapat digunakan oleh Pengoptimal Kueri.Pertanyaan tetap: Bagaimana Anda memeriksa Sort_merge_passes ???
Gunakan kode ini, untuk memeriksa berapa banyak Sort_merge_passes yang terjadi dalam 5 menit terakhir. Itu juga menghitung Sort_merge_passes per jam.
Jika Anda menemukan Sort_merge_passes dan nilai terlalu tinggi, jangan ragu untuk meningkatkan sort_buffer_size . Misalkan Anda ingin menaikkan ke 4M. Anda akan menjalankan ini:
Anda kemudian akan menambahkan ini ke my.cnf
Anda akan menjalankan kode secara berkala untuk memeriksa waktu lain Sort_merge_passes paku.
sumber
Anda tidak perlu mengubah sort_buffer_size dari default. Anda salah paham penggunaannya berdasarkan pertanyaan. Anda harus mulai dengan memeriksa SQL untuk melihat apakah Anda dapat menyelaraskannya dan memenuhi persyaratan ORDER BY / GROUP BY dengan menggunakan indeks. Biasanya akan menjadi indeks komposit.
Lebih lanjut: http://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/
sumber
.cnf
file sampel yang dikirim dengan mysql tidak menggunakan pengaturan default.Panduan dalam manual (5.0-5.5) adalah
Dari 5.6 dan seterusnya, kata-kata menunjukkan bahwa pengoptimal dapat memilih nilai untuk kueri dan bahwa server dapat memperluas buffer hingga batas. Ini mengurangi biaya pengaturan nilai terlalu tinggi. Jadi sepertinya Anda mungkin ingin menjadi konservatif, lebih rendah dari standar (Seperti yang dilakukan file cnf rilis) untuk rilis di bawah 5.6.4 tetapi dapat memiliki batas yang lebih tinggi dari mengatakan 2MB default, atau bahkan lebih, dari 5.6. 4 karena jumlah penuh tidak dialokasikan secara membabi buta.
sumber
Cara terbaik untuk menentukan yang optimal
sort_buffer_size
adalah dengan membandingkannya.Bagaimana? Seperti @RolandoMySQLDBA mengatakan pengecekan
Sort_merge_passes
mungkin bermanfaat, tapi itu bukan satu-satunya faktor yang mempengaruhi kinerja. Anda harus berhati-hati ketika menambahsort_buffer_size
.Dokumen itu mengatakan itu
Ada posting tentang pengujian yang menyimpulkan itu
Ketika saya diuji, saya juga mendapatkan hasil yang serupa.
Idealnya, akan lebih baik untuk menghindari situasi yang Anda butuhkan untuk mengoptimalkan
sort_buffer_size
. Bagaimana? Dokumen ORDER BY Optimization ini dapat membantu Anda memahami bagaimana segala sesuatu bekerja di bawah tenda.sumber
"mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;" ini cara yang buruk untuk memasukkan 4m ukuran penyangga, itulah yang membuat ukuran penyangga menggunakan 4GB
"mysql> SET GLOBAL sort_buffer_size = 1024 * 4;"
Jika saya sudah menjadi milik Anda, saya tidak mencoba mengubah ukuran buffer pendek, itu adalah cara yang baik untuk membuat server Anda crash, dan mengirim kinerja sampah. Lebih baik mencoba membuat querys yang lebih baik.
sumber
1024 * 4
. Itu 4096, 4K.