Benzersiz anahtarla MyISAM üzerindeki bölümlerle MySQL uçlarını hızlandır


9

Büyük bir MyISAM tablo (~ 30M satır) var. Bir noktada sabit satır biçimine geçtim, şimdi tablo diskte ~ 40Gb ve dizinler için 2Gb alır. Tablo benzersiz bir dizine sahiptir ve saniyede 100 'yinelenen anahtar güncellemesi ekleme' sorgusu vardır. Tablo büyüdükçe bu kesici uçlar yavaşlar ve yavaşlar.

Emin değilim, ancak bölümler uçları hızlandırmama yardımcı olacak mı?

Yanıtlar:


1

Her şeyden önce, eşzamanlı yazma işlemleri kesinlikle MyISAM depolaması için bir seçenek değildir. Her biri bir tabloyu kilitleyecektir (bazı durumlarda okumak hariç). InnoDB size iyi uymuyorsa TokuDB'yi deneyin. Ancak TokuDB (ve tabii ki InnoDB) motorunun işlemsel yapısı nedeniyle MyISAM ile karşılaştırıldığında daha yavaş olacaktır (aynı verileri en az iki kez yazmalısınız: günlük ve veri dosyaları). Ayrıca, sunucunuz bir gün çökerse, 40Gb MyISAM tablonuzun onarılmasına kadar saatlerce bekleyeceksiniz.

Hala MyISAM tablolarınıza veri yüklemek istiyorsanız ve bunu hızlı bir şekilde yapmak istiyorsanız LOAD DATA INFILE, insertler yerine kullanmanızı tavsiye ederim . Büyük hacimli verileri tabloya yüklemenin en hızlı yolu budur. Ve evet, dizinler kesici uç performansını üstel şekilde yavaşlatır.

Bölümler hakkında bir kelime: MySQL'deki INSERT deyimleri budamayı desteklemez, bu nedenle tüm bölümleriniz benzersiz dizin eşleşmesi için her deyimde taranır. Ayrıca, tüm bölümler kesici uç bitene kadar kilitlenir.



0

Bu ekleme sorguları aynı anda mı yoksa aynı işlemden mi kaynaklanıyor? Eşzamanlıysa, MyISAM tüm tabloyu kilitlediğinden ve InnoDB satır kilitlerini kullandığından InnoDB depolama alanını kullanmak daha iyidir. Başka bir depolama birimine geçmek bir seçenek değilse, INSERT DELAYED deyimini ve bir dizi diğer ekleme optimizasyonunu deneyebilirsiniz . Farklı fiziksel disklere farklı bölümler yerleştirmediğiniz sürece bölümleme yardımcı olmaz.


Bu uçlar eşzamanlı. Ancak InnoDB 'yinelenen anahtar güncellemesine ekle' durumunda çok yavaş, bu yüzden bir seçenek değil. IO söyleyebilirim ki bir darboğaz değil - RAM miktarı >> dizinleri ve yazma önizleme dahil tabloların boyutu açık. Bence sorun iç mysql'in kilitlerinde ya da başka bir yerde yatıyor.
d0rc

INSERT DELAYED, yalnızca değer listelerini belirten INSERT ifadeleri için kullanılmalıdır. Sunucu, DUPLICATE KEY UPDATE deyimlerinde INSERT ... SELECT veya INSERT ... için DELAYED değerini yok sayar.
llazzaro

"InnoDB çok yavaş" - biraz ayarlamayı denediniz mi? Varsayılan ayarlar oldukça zayıf.
rvs
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.