MySQL INSERT ve UPDATE performansı nasıl geliştirilir?


14

Bu soru muhtemelen StackOverflow'da da sorulabilir, ancak önce burada deneyeceğim ...

Veritabanımızdaki INSERT ve UPDATE ifadelerinin performansı kötüleşiyor ve web uygulamamızda zayıf performansa neden oluyor.

Tablolar InnoDB'dir ve uygulama işlemleri kullanır. İşleri hızlandırmak için yapabileceğim bazı ince ayarlar var mı?

Sanırım bazı kilitleme sorunları görüyor olabiliriz, nasıl öğrenebilirim?


Dba.stackexchange.com
Pacerier'da

Yanıtlar:


25
  1. Donanımınızın ve işletim sisteminizin doğru yapılandırılıp ayarlanmadığını kontrol edin:

    • Sorunun kaynağı (CPU / IO / Bellek / Değiştirme Kullanımı). Çok fazla GİB var mı? CPU yüklü mü? Eğer çok fazla okuma IOP'niz varsa muhtemelen yeterince büyük InnoDB buffer_pool'a sahip değilsiniz. CPU yüklüyse, sorgularınız uygun dizinleri kullanmak yerine tam tablo taramaları yapar.
    • Disk / RAID / LVM kurulumu. Bazı özel kurulumlarda LVM şeritlemesi disk yükünü eşitleyerek size fayda sağlayabilir (donanım RAID'si yok, birden fazla LUNS bağlı)
    • IO zamanlayıcı: iyi bir donanım RAID denetleyicisine sahipseniz, muhtemelen noop en iyisidir. RedHat bazı testler yaptı ve Oracle (ve diğer DB) CFQ için en iyi seçim olduğunu söylediler. Bazı kriterleri (tpc-c veya tpc-e gibi) çalıştırmanız ve donanımınız için en iyi olanı seçmeniz gerekir.
    • İyi dosya sistemi - ext3, veritabanına özgü iş yüklerinde iyi performans göstermez. XFS veya OCFS2 daha iyi. Tekrar bazı kriterlere ihtiyacınız var.
    • Sisteminizde takas kullanılıyorsa izleyin. Takas kullanımı mysql performansını düşürür .
  2. MySQL / InnoDB örneğinizin düzgün şekilde ayarlanıp ayarlanmadığını kontrol edin:

    • arabellek havuzu boyutu - bellekte önbellek veri sayfaları
    • innodb_flush_method = O_DIRECT - çift IO arabelleğe almayı önle
    • InnoDB günlük dosyası boyutunu artırmak - yazma yoğun iş yükü için bu performansı artırabilir. Ancak unutmayın: daha büyük günlük dosyası boyutu daha uzun kilitlenme kurtarması anlamına gelir. Bazen saatler içinde !!!
    • innodb_flush_log_at_trx_commit = 0 veya 2 - ACID konusunda endişe duymuyorsanız ve son iki veya iki saniye boyunca işlemleri kaybedebilirsiniz.
    • key_buffer_size - MyISAM için çok önemlidir, ancak disk geçici tabloları için kullanılır.
    • INNODB DURUMUNUZU izleyin
  3. İş yükünüzü analiz edin - tüm sorgularınızı yavaş sorgu günlüğüne alın ve üzerinde mk-query-digest çalıştırın. Tcpdump ve maatkit kullanarak tüm sorguları yakalayabilirsiniz
    • Hangi sorgular sunucunuzun zamanının çoğunu alır?
    • Geçici tablolar, özellikle büyük geçici tablolar oluşturuldu mu?
    • Öğrenin, nasıl kullanacağınızı açıklayın
    • Uygulamanız işlem kullanıyor mu? Autocommit = 1 (varsayılan MySQL için) ile sorgular çalıştırdığınızda, her ekleme / güncelleme sorgusu bazı ek yükler yapan yeni işlem başlatır. Mümkünse, otomatik tamamlamayı devre dışı bırakmak daha iyidir (python MySQL sürücüsünde otomatik tamamlama varsayılan olarak devre dışıdır) ve tüm değişiklikler yapıldıktan sonra manuel olarak tamamlama işlemini gerçekleştirin.
    • Uygulamanız bir döngü içinde aynı tabloya bir dizi ekleme yapıyor mu? Load data infileekler dizisi için komut çok daha hızlıdır.
    • Unutmayın: select count(*) from table;innodb için myisam'dan çok daha yavaştır.
    • Ne tür INSERT / UPDATE sorguları sunucu süresinin çoğunu alır? Nasıl optimize edilebilirler?
    • DB'nizin uygun dizinleri olup olmadığını kontrol edin ve gerekiyorsa ekleyin.

Çevremizde bir tür güncelleme sorgusunun yavaş olduğu durumu vardı. Toplu işi bitirmek için tahmini süre 2 gün !!! Yavaş sorgu günlüğünü analiz ettikten sonra, bu tür bir güncelleme sorgusunun tamamlanması 4 saniye sürüyor. Sorgu şuna benziyordu: update table1 set field1=value1 where table1.field2=xx table2.field3=yy and table2.field4=zz. Güncelleme sorgusunu sorguyu seçmek için dönüştürdükten ve bulduğumuz seçili sorguyu açıkladıktan sonra, bu tür bir sorgu dizini kullanmaz. Doğru indeks oluşturduktan sonra güncelleme sorgusu yürütme süresini milisaniyeye düşürdük ve tüm iş iki saatten daha kısa sürede tamamlandı.

Bazı yararlı bağlantılar:


Tüm bu endeksleri kontrol etmeden önce. "Biz indeks yok çünkü tablolar büyür gibi" kokusu aşağılamak.
TomTom

5

Varsayılan innoDB yapılandırması ile işlemleri diske ne kadar hızlı yazıp temizleyebileceğinizle sınırlı olacaksınız. Biraz ACID kaybetmeyle başa çıkabiliyorsanız, innodb_flush_log_at_trx_commit ile deneme yapın. Günlüğü diske her saniye yazmak ve temizlemek için 0 olarak ayarlayın. Her işlemde yazmak ve yıkamak için 1 (varsayılan) olarak ayarlayın. Günlük dosyaya her kaydetme işleminden sonra yazmak için 2'ye ayarlayın, ancak saniyede bir kez yıkayın.

1 işlem kaybetme ile başa çıkabilirseniz, bu yazma performansını büyük ölçüde artırmak için harika bir yol olabilir.

Ayrıca, disklerinizin ne yaptığına dikkat edin. RAID 10> RAID 5 fazladan bir disk pahasına yazar.


1

Kilitleme sorunları, bağlantı durumları ile show full processlist;

my.cnfVe MySQL belgelerini okuyun . Yapılandırma seçenekleri çok iyi belgelenmiştir.

Genel olarak konuşursak, mümkün olduğunca bellekte işlenmesini istersiniz. Sorgu optimizasyonu için, bu geçici tablolardan kaçınmak anlamına gelir. Endekslerin doğru uygulanması.

Ayarlama, tercih ettiğiniz veritabanı motoruna ve uygulama mimarisine özgü olacaktır. İnternet araması için önceden var olan önemli kaynaklar var.



0

InnoDB oldukça iyi bir motor. Bununla birlikte, büyük ölçüde 'ayarlanmaya' dayanır. Bir şey, eklemeleriniz birincil anahtarları artırma sırasına sahip değilse, innoDB'nin MyISAM'den biraz daha uzun sürebileceğidir. Bu, daha yüksek bir innodb_buffer_pool_size ayarlanarak kolayca aşılabilir. Benim önerim, toplam RAM'inizin% 60-70'ine ayarlamanızdır. Şu anda üretimde bu tür 4 sunucu çalıştırıyorum ve dakikada yaklaşık 3,5 milyon satır ekliyorum. Zaten 3'e yakın Terabayt var. InnoDB, yüksek eşzamanlı uçlar nedeniyle olması gerekiyordu. Uçları hızlandırmanın başka yolları da vardır. Ben de bazılarını kıyasladım.


0

Java uygulamasında otomatik taahhüt ve taahhüt değişikliklerini devre dışı bırakarak web uygulamasında MySQL'deki performans ve ekleme performans sorunlarını nasıl çözebilirim? MySQL belgelerinde önerildiği gibi.

MySQL Belgeleri

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.