MySQL için hangi konfigürasyon seçenekleri en büyük hız iyileştirmelerini sağlar?


29

MySQL için hangi konfigürasyon seçenekleri en büyük hız iyileştirmelerini sağlar?

Gerçek yapılandırma dosyası geliştirmeleri, tablo tipleri, donanım ayarları, çoğaltma vb. Hakkında merak ediyorum. Sorgu yapısı ve tablo yapısı dışında herhangi bir şey (bunlar web sitesinde ve Yığın Taşması'nda bulmak kolaydır). Sorgu önbellek ayarları gibi şeyler size en çok hızı veren nedir? Peki ya sürücüler; Harici bir RAID veya dahili olması daha iyi mi? Çoğaltma, özellikle büyük sorguları okurken size daha iyi performans verdi mi?

MySQL'in performansını artırmak için başka hangi ayarları / değişiklikleri yaptınız?

Not: Bunların kullanıma çok bağlı olduğunu (yani küçük web sitesi vs veri deposunun) olduğunu fark ettim, ancak çoğumuzun çeşitli siteler / sistemler üzerinde çalıştığını düşünüyorum. durumlar. Ayrıca, bazı tekniklerin durumlar arasında aktarılabileceğini düşünüyorum.


Tamamen ilgili değil, ama usta için InnoDB kullanmanız gerekir. Sen MyISAM kölelere çoğaltmak ve kullanabilir, tümleşik olan çok daha hızlı GİBİ daha metin aramalarını yapabilir tam metin arama
Neil McGuigan

Yanıtlar:


20

İşte önerilerim (kastınız değişebilir)

  • Donanım RAID kullanın. Bu, diğer yayınlarda RAID yazılımı kullanma önerilerime aykırıdır, ancak bu donanım RAID kartını istediğiniz belirli bir durumdur. Özellikle, günlük dosyasını fsync'e götürme süresini azaltmak için pilin NVRAM'ın RAID kartta yedeklenmesini istiyorsunuz.
  • SADECE RAID 1 veya RAID 10 birimlerini kullanın. RAID 5 veya 6 yazma işleminin maliyeti, karışık okuma / yazma iş yükünde tahammül edemeyecek kadar yüksek.
  • Veri, günlük ve tmp birimleri için ayrı LUN'lar kullanın. Bunların hepsi işletim sisteminden ayrı olmalı ve hacimleri değiştirmelidir.
  • InnoDB kullanın .
  • İnnodb_file_per_table kullanın
  • 64 bit işletim sistemi kullanın
  • InnoDB tampon havuzunuzu mevcut RAM'inizin ~% 80'ine ayarlayın
  • Günlük dosyalarınızı arabellek havuzu boyutunuzun 1 / 4'ü, 2 ila 4 günlük dosyası arasında ayarlayın. Daha büyük günlük dosyaları daha yavaş kapanma ve kurtarma süreleri anlamına gelir, ancak büyük veritabanı dökümlerini daha hızlı geri yüklemenizi sağlar.
  • log_slow_queries, log-sorgular-kullanmıyor-endeksler, set-değişken = long_query_time = 1, bu günlükteki her sorguyu araştırın, tablo taramalarını önlemek için şemaınızı yeniden gözden geçirin ve mümkün olduğunda tabloları tmp yapın.

11

Bir kez daha Dave Cheney gerçekten buradaki parktan çaldı. Soruna cevabına hiçbir şey ekleyemiyorum. Ancak ne sormadığınızı belirtmek isterim. Jeremy Zawodny ve Peter Zaitsev'in bana yıllar önce öğrettiği gibi, kötü sorguları izlemek ve kötü sorguları optimize etmek için harcadığınız zaman için yatırım getirisi, yapılandırma değişikliklerini 10 kat yaparak geçirdiğiniz zaman için yatırım geri dönüşünüzü yapacak. Tabii ki, kötü bir konfigürasyona, yanlış RAID ayarına veya yetersiz RAM'e sahip olmak istemezsiniz. Ancak, mükemmel ve hatta marjinal arasında, MySQL DBA'ların kötü sorguları (genellikle DBA'dan değil geliştiricilerden / çerçevelerden), kötü yapılandırmanın dayanılmaz bir durum olduğu kronik bir durumdur .

(Bir süredir bu sıfatlar için uğraştım ve yine de seçtiklerimden memnun değilim.)

Eğer geliştiricileriniz Ruby on Rails ve Django gibi çerçevelerdeki gibi bir ORM kullanıyorsa, gerçekten DB'nize çarpan sorguları izlemelisiniz. Geliştiriciler SQL'i düşünmeyi bıraktıklarında ve DB'nin soyutlanmasına izin verdiklerinde, bu sürünmeyi gerçekten çok kötü yaparlar. Az önce bahsettiğim iki çerçeveyi seviyorum. (Kötü ağızları yüzünden beni oylama.) Sadece Query Sleuthing'i çok önemli kılıyor. (Oku: İş Güvenliği)


4

Başka birkaç şey (Dave Cheney'in cevabında bahsedilmeyen)

  • Verilerin çift tamponlanmasını önlemek için innodb_flush_method öğesini O_DIRECT olarak ayarlamayı deneyin. RAID kartınızda pil destekli yazma önbelleği yoksa veya verileriniz bir SAN kullanıyorsa, bu durumdan kaçının.

  • Ayrıca innodb_thread_concurrency ile oynayın. Varsayılan değerin 8 olduğuna inanıyorum, ancak performansı artırıp artırmadığını görmek için bunu ince ayarlamaya değer

  • Sorgu önbelleğinin açık olduğundan emin olun ve isabet oranının ne olduğunu görmek için istatistikleri kontrol edin. Eğer iyi ise, isabet oranını iyileştirip iyileştirmediğini görmek için arttırmayı deneyin.

  • Çalışan uygulamalara bağlı olarak, varsayılan yalıtım seviyesini değiştirebilirsiniz. Varsayılan değer REPEATABLE_READ'dir, ancak READ_COMMITTED size daha iyi performans verebilir

  • İfadeleriniz çoğunlukla GÜNCELLEME ve SİLME ise, değiştirilecek sonuç kümesini döndüren bir SELECT sorgusu yaparak köleğe önbellek doldurmayı deneyebilirsiniz. Bunu sizin için yapacak mk-slave-prefetch aracına göz atın

  • MyISAM ve InnoDB dışındaki diğer depolama motorlarına göz atın



1

Yapmanız gereken ilk genel şey, bellek parametrelerine bakmaktır. MySQL için varsayılan ayarlar çok muhafazakar. Hangi motoru kullanırsanız kullanın, muhtemelen bellek parametrelerinin bir kısmını on, hatta yüz kat arttırmanız gerekecektir.

Yapmanız gereken bir sonraki şey masa önbelleğine bakmak. Varsayılan değer 64'tür, bu yalnızca 60 tablodan daha fazlasına sahip değilseniz kullanışlıdır. Bunu uzun bir yoldan yükseltmek isteyeceksiniz.

Yapmanız gereken üçüncü şey, iş parçacığı ve bağlantı parametrelerine bakmaktır. Varsayılan wait_timeout çoğu web tabanlı uygulama için oldukça uzundur ve 30 saniye gibi bir şeye düşürülebilir. Bu, MySQL'in bağlantıları daha kısa sürede yakalayacağı ve böylece 'uyku' durumunda kalmayacak kadar az kalarak bellek kullanımını da artıracaktır.

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.