2010-03-17 18 views
21

bazen, bir projeye ait verileri yeniden içe aktarmam gerekiyor, böylece MySQL tablosuna yaklaşık 3.6 milyon satır okuyor (şu anda InnoDB, ancak aslında bu motorla gerçekten sınırlı değil). "Verileri yükle ..." en hızlı çözüm olduğunu kanıtladı, ancak bir tradeoff var: - anahtarlar olmadan içe aktarılırken, içe aktarmanın kendisi yaklaşık 45 saniye sürüyor, ancak anahtar oluşturma işlemi (20 dakika boyunca çalışıyor) yaşlanıyor. ..). - tablodaki anahtarlarla içe aktarma işlemi içe aktarmayı çok daha yavaş hale getiriyorMySQL yükleme verileri infrared - hızlanma?

Sayısal alanlara referans vererek, tablonun 3 alanı üzerinde tuşlar vardır. Bunu hızlandırmak için herhangi bir yolu var mı?

Başka bir sorun: yavaş bir sorgu başlatılan işlemi sonlandırdığımda, veritabanında çalışmaya devam eder. Mysqld yeniden başlatmadan sorgu sonlandırmak için herhangi bir yolu var mı?

Çok teşekkürler dBA

+0

Kayıtlar ne kadar büyük? – Grumpy

+0

yaklaşık 60 ila 100 bayt, 5 ila 8 alan. Gerçekten büyük bir şey yok, her şeyi yavaşlatan çok büyük miktar. – DBa

cevap

38

innodb ve toplu yükleme kullanıyorsanız, birkaç ipucu:

csv dosyanızı hedef tablonun birincil anahtar sırasına göre sıralayın: unutmayın innodbkullanıyorkümelenmiş birincil anahtarları böylece sıralandığında daha hızlı yüklenecek!

tipik yük veri infile i kullanın:

set unique_checks = 0; 
set foreign_key_checks = 0; 
set sql_log_bin=0; 

küçük parçalar

tipik ithalat istatistiklerini i içine csv dosyası bölme

truncate <table>; 

set autocommit = 0; 

load data infile <path> into table <table>... 

commit; 

diğer optimizasyon Eğer yükleme süreleri artırmak için kullanabilirsiniz Toplu yükleme sırasında gözlemledik:

3.5 - 6.5 million rows imported per min 
210 - 400 million rows per hour 
+0

Benzersiz_sayfalar'ın devre dışı bırakılması, birincil anahtara göre sıralamanın yanı sıra performansı da iyileştirdi. Teşekkürler! – DBa

1

InnoDB oldukça iyi bir motordur. Bununla birlikte, "ayarlanmış" olmaya büyük önem vermektedir. Bir şey şu ki, ekleriniz birincil anahtarların sırasına göre değilse, innoDB MyISAM'den biraz daha uzun sürebilir. Bu daha yüksek bir innodb_buffer_pool_size ayarlayarak kolayca üstesinden gelinebilir. Benim önerim, özel bir MySQL makinesinde toplam RAM'inizin% 60-70'ini belirlemektir.

İlgili konular