2010-09-30 40 views
7

Özel bir ürün için mysql ekleme hızı ve performans modelleriyle ilgili daha iyi anlamak için çalışıyorum yetişir. Yeni satır eklemeye devam ettiğim iki tablo var. aşağıdaki gibi iki tablo tanımlanmıştır:Ekleme hızı yavaşlama mysql

CREATE TABLE events (
added_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
id BINARY(16) NOT NULL, 
body MEDIUMBLOB, 
UNIQUE KEY (id)) ENGINE InnoDB; 

CREATE TABLE index_fpid (
fpid VARCHAR(255) NOT NULL, 
event_id BINARY(16) NOT NULL UNIQUE, 
PRIMARY KEY (fpid, event_id)) ENGINE InnoDB; 

Ve (her yeni nesne için, bir tane işlemde her iki tablolara ilgili bilgileri ekleyin) iki tabloda yeni nesneler ekleyerek devam edin. İlk başta, 600 eklemeler/sn olsun, ancak ~ 30000 satır sonra, daha sonra, (200 ekleme/sn) etrafında daha yavaş, ama yine de fark yavaşlama belirgin bir yavaşlama alır.

Ben masa büyüdükçe, IO sayılar daha yüksek ve daha yüksek olsun beklemek olduğunu görebilirsiniz. İlk düşüncem indeks tarafından alınan hafızaydı, ancak bunlar 768 Mb'ye sahip bir VM üzerinde yapıldı ve bu işe tek başına (2/3'ü kullanılmayan bellek) adanmıştır. Ayrıca, çok fazla bellek alarak 30000 satır, daha çok sadece dizinleri (tüm MySQL veri dir < 100 Mb zaten) görünce zor anlar var. Bunu doğrulamak için ben VM (64 Mb) çok az bellek tahsis ve yavaşlama desen neredeyse aynı (yani yavaşlama yerleştirmelerin aynı sayılardan sonra görünür), bu yüzden ben nispeten yeni duyuyorum, özellikle de bazı yapılandırma sorunları şüpheli veritabanları. alt text

Bunun yararlı buysa kullanılabilir yapabilmeleri, sorunu yeniden üreten bir kendine yeten python komut var şu şekildedir:

desen görünüyor.

Yapılandırma:

  • Ubuntu 10,04, KVM'nin çalışan 32 bit, 760 Mb ayarlanması için kullanılmaktadır.
  • MySQL 5.1, tablolar
  • için ayrı dosyalar ile kutu yapılandırması dışına

Eric Holmberg için çok teşekkür ederim [DÜZENLE], o çivilenmiş. İşte makul bir değere innodb_buffer_pool_size sabitleme sonra grafikleri şunlardır: alt text

+0

Sorun, sürücüye sanal veya başka bir şekilde yazma olanağı. –

+0

Neyi kastettiğimi anladığımdan emin değilim: Diske yazmanın zaman aldığını anlıyorum, ancak bu tablo büyüdükçe yavaşlamayı açıklamıyor. –

cevap

8

düzenleyin /etc/mysql/my.cnf dosyasını ve InnoDB ara bellek havuzuna yeterli bellek ayrılamadı emin olun. Bu özel bir önemsiz ise, muhtemelen sistem belleğinizin% 80'ini kullanabilirsiniz.

# Provide a buffer pool for InnoDB - up to 80% of memory for a dedicated database server 
innodb_buffer_pool_size=614M 

birincil anahtarlar

B Ağaçları böylece uçlar daima O (logn) zaman alacaktır ve önbellek tükendi kez, onlar deli gibi takas başlayacak bulunmaktadır. Bu olduğunda, muhtemelen ekleme hızınızı devam ettirmek için verileri bölümlemek isteyeceksiniz. Bölümleme hakkında daha fazla bilgi için bkz. http://dev.mysql.com/doc/refman/5.1/en/partitioning.html.

İyi şanslar!

+0

O kadardı, çok teşekkür ederim. Farkı göstermek için grafikleri güncelleyeceğim, oldukça çarpıcı. Bölümleme ipucu için teşekkürler: Zaten bölüme bakıyordum, ama önce bu meseleyi anlamadan oraya gitmek istemedim. –

+2

Grafikler güncellemek için ekstra mil için teşekkürler - ikinci set harika görünüyor! –

1

Kişisel endeksleri sadece ilerledikçe yavaş yavaş şekil çıkmak, ekleme esnasında analiz ve optimize edilmesi gerekebilir. Diğer seçenek ise, daha tutarlı bir performans vermesi gereken daha sonra bunları ekleyip yeniden oluşturduğunuzda dizinleri tamamen devre dışı bırakmaktır.

Great link about insert speed.

ANALYZE. OPTIMIZE

+0

Sadece iki dizin var - birincil anahtar ve benzersiz bir kısıtlama. Her ikisi de benzersiz değerleri zorlar. Silmeler olmadıkça, sürdürülecek bir şey yoktur. –

+0

Dizini devre dışı bırakabileceğimi sanmıyorum (uygulamamda, ekleri yazılır yazıldıktan sonra kullanıma hazır hale getirmem gerekiyor ve ekler "gerçek zamanlı" olarak geliyor, bu toplu işlem değil). –

+0

Size güveniyorum OMG, eğer böyle bir durumda olduğunu söylerseniz, cevabınızı merakla bekleyebilirim, böylece öğrenebilirim. –

0

Eklemenin bir anahtar kısıtlamayı ihlal etmediğini doğrulamak biraz zaman alır ve bu süre tablo büyüdükçe büyür. Düz çıkış performansı ile ilgileniyorsanız, LOAD DATA INFILE kullanarak ekleme hızınızı önemli ölçüde artıracaktır.

+0

Tabloyu büyüdükçe yavaşlatmayı bekledim (dizin (ler) güncelleştirmelerinin günlük (N) maliyeti nedeniyle). Ama burada yavaşlama IO'nun artmasından kaynaklanıyor, eğer iowait% ine inanıyorum ve bu beklenmedik (çünkü tamamen hafızaya sığacak kadar küçük bir veri kümem var). Ayrıca, grafiklerim günlük (N) yavaşlama göstermiyor. –

+0

Bir şekilde tüm veri kümenizin belleğe sığacağı nadirdir, ancak sorununuz çözüldüğüne sevindim. “LOAD DATA INFILE”, gereksinimleriniz böyle olduğunda daha fazla performans artışı gösterecektir. –