Optimal sort_buffer_size nasıl belirlenir?


10

Aşağıdakileri söyleyen örnek bir yapılandırma dosyasından okudum:

# 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.

Filesort kullanan birkaç sorgum var. Sorguların diske çarpmadan sorunsuz çalışması için gereken arabellek boyutunun ne olduğunu nasıl belirlerim?


Mysqltuner veya tuning-primer çalıştırdınız mı Bu uygulamalarda my.cnf dosyanızla ilgili ilginç bir şey görebilirsiniz.
David Martinez

Yanıtlar:


14

Sort_buffer_size ile ilgilenen tek bir durum değişkeni vardır . Şu sorudaki mesajda bulunan şey şu: Sort_merge_passes . MySQL Belgeleri şöyle diyor:

Sort_merge_passes: Sıralama algoritmasının yapmak zorunda olduğu birleştirme geçişlerinin sayısı. Bu değer büyükse , sort_buffer_size sistem değişkeninin değerini artırmayı düşünmelisiniz .

Lütfen sort_buffer_size hakkında bir şey unutmayın

GLOBAL STATUS GÖSTER çıktısında saniyede çok sayıda Sort_merge_passes görürseniz, sorgu optimizasyonu veya geliştirilmiş dizin oluşturma ile iyileştirilemeyen ORDER BY veya GROUP BY işlemlerini hızlandırmak için sort_buffer_size değerini artırmayı düşünebilirsiniz.

Yükselterek iken sort_buffer_sizeile teneke yardım sorguları GROUP BYs ve ORDER BYs, sizi daha iyi artırabilir sorguları iyileştirilmesi ve Sorgu Doktoru tarafından kullanılabilecek indeksleri eklemeyi kapalıdır.

Soru kaldı: Sort_merge_passes nasıl kontrol edilir ???

Son 5 dakika içinde kaç tane Sort_merge_passes olduğunu kontrol etmek için bu kodu kullanın. Ayrıca saatte Sort_merge_passes değerini hesaplar.

SET @SleepTime = 300;
SELECT variable_value INTO @SMP1
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SELECT SLEEP(@SleepTime) INTO @x;
SELECT variable_value INTO @SMP2
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SET @SMP = @SMP2 - @SMP1;
SET @SMP_RATE = @SMP * 3600 / @SleepTime;
SELECT @SMP,@SMP_RATE;

Sort_merge_passes ve oranı çok yüksek bulursanız, sort_buffer_size değerini artırmaktan çekinmeyin . 4M'ye yükseltmek istediğinizi varsayalım. Bunu çalıştırırsınız:

mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;

Daha sonra bunu my.cnf dosyasına eklersiniz

[mysqld]
sort_buffer_size = 4M

Diğer dönemlerde Sort_merge_passes ani artışlarını kontrol etmek için kodu düzenli olarak çalıştırırsınız .


2
Bu çok daha iyi bir cevaptır
Greg

7
@RolanoMySQLDBA "birçok" tanımını aşağıdaki şekilde yapabilirsiniz: "Saniyede çok fazla Sort_merge_passes görürseniz"
Tarek

2

Sort_buffer_size değerini varsayılan olarak değiştirmeniz gerekmez. Soruyu temel alarak kullanımını yanlış anlıyorsunuz. SQL'i ayarlayıp, bir dizin kullanarak ORDER BY / GROUP BY koşullarını karşılayıp karşılamadığınızı görmek için inceleyerek başlamalısınız. Genellikle bileşik bir dizin olacaktır.

Ayrıca: http://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/


Bu gönderiyi pek kullanışlı bulamadığımı söylediğim için üzgünüm. Tıpkı bir uzman olmadığınız için insanlara bir şey yapmamalarını söylemek gibidir. İlk yorumcunun işaret ettiği gibi, .cnfmysql ile gönderilen örnek dosyalar varsayılan ayarı kullanmaz.
Question Overflow

Tekrar okursanız, uzmanın değeri varsayılandan değiştirmemeyi zaten bildiğini de söyler. Örnek .cnf dosyaları iyi uygulama olarak kullanılmamalı veya bunlara referans verilmemelidir. Bir my.cnf dosyası oluşturmak için yardıma ihtiyacınız varsa Percona oldukça kapsamlı bir sihirbaz sunar. tools.percona.com/wizard
eroomydna

2

Kılavuzdaki (5.0-5.5) kılavuz

GLOBAL STATUS GÖSTER çıktısında saniyede çok sayıda Sort_merge_passes görürseniz, sorgu optimizasyonu veya geliştirilmiş dizin oluşturma ile geliştirilemeyen ORDER BY veya GROUP BY işlemlerini hızlandırmak için sort_buffer_size değerini artırmayı düşünebilirsiniz. Tüm arabellek, her ne kadar gerekli olmasa bile tahsis edilir, böylece genel olarak gerekenden daha büyük bir değere ayarlamak, bu tür sorguların çoğunu yavaşlatır. Bir oturum ayarı olarak ve yalnızca daha büyük bir boyuta ihtiyaç duyan oturumlar için artırmak en iyisidir. Linux'ta, daha büyük değerlerin bellek ayırmayı önemli ölçüde yavaşlatabileceği 256 KB ve 2 MB eşikleri vardır, bu nedenle bu değerlerden birinin altında kalmayı düşünmelisiniz. İş yükünüz için en iyi değeri bulmak için deneme yapın.

5.6'dan itibaren ifade, optimize edicinin bir sorgu için bir değer seçebileceğini ve sunucunun arabelleği sınıra kadar uzatabildiğini gösterir. Bu, değeri çok yüksek ayarlama maliyetini azaltır. Bu nedenle, 5.6.4 altındaki sürümler için varsayılandan daha düşük (sürüm cnf dosyaları gibi) muhafazakar olmak isteyebileceğiniz gibi görünüyor, ancak 5.6'dan varsayılan 2MB veya daha fazla bir sözde daha yüksek bir sınıra sahip olabilir. 4 tam miktar körü körüne tahsis değil gibi.

MySQL 5.6.4 itibariyle, optimize edici ne kadar alan gerektiğini bulmaya çalışır ancak sınıra kadar daha fazla alan ayırabilir.


1

Optimali belirlemenin en iyi yolu sort_buffer_size, onu karşılaştırmaktır.

Nasıl? @RolandoMySQLDBA gibi, kontrol etmenin Sort_merge_passesyararlı olabileceği gibi, performansı etkileyen tek faktör bu değildir. Arttırırken dikkatli olmalısın sort_buffer_size.

Belge diyor ki

Linux'ta, daha büyük değerlerin bellek ayırmayı önemli ölçüde yavaşlatabileceği 256 KB ve 2 MB eşikleri vardır, bu nedenle bu değerlerden birinin altında kalmayı düşünmelisiniz.

Orada bir post sonucuna varır testi hakkında

sort_merge_passeso kadar da kötü değil. Büyükünüzü sort_buffer_sizesıfır olacak şekilde ayarlamak uygun sort_merge_passesolmayabilir.

Test ettiğimde de benzer bir sonuç alıyorum.

İdeal olarak, optimize etmeniz gereken durumdan kaçınmak en iyisidir sort_buffer_size. Nasıl? Bu ORDER BY Optimizasyon belgesi , işlerin başlık altında nasıl çalıştığını anlamanıza yardımcı olabilir.


-1

"mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;" 4m sıralama arabellek boyutunu koymak için kötü bir yol, bu sıralama arabellek boyutu 4GB kullanımı var yapar

"mysql> SET GLOBAL sort_buffer_size = 1024 * 4;"

Ben senin olsaydım, kısa tampon boyutunu değiştirmeye çalışmıyorum, bu sunucunuzun çökmesini ve çöp performansına göndermenin iyi bir yoludur. Daha iyi sorgulamalar yapmak daha iyi olur.


1
4K sıralama arabelleğinde nasıl büyük bir sıralama olabilir? Söylediğine dikkat et 1024 * 4. Bu 4096, 4K.
RolandoMySQLDBA

Rolando ne dedi ^^. Ve izin verilen minimum değer 32K'dır.
ypercubeᵀᴹ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.