2009-07-11 30 views
14

Bir gün ben Hadoop öğrenmek ve olmayan yapılandırılmış veritabanına tüm bu verileri aktarmak gerekecek şüpheli ama bu kadar kısa bir sürede bu kadar önemli ölçüde performansını düşürebilir bulmak için şaşırdım zamanınMySQL performans

6 milyonun altında satır içeren bir mysql tablom var. Bu tabloda çok basit bir sorgu yapıyorum ve yerinde tüm doğru dizinlere sahip olduğumu düşünüyorum.

sorgu

 
SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date 

bildiğim kadarıyla söyleyebilirim bu yüzden doğru endeksi kullanıyorum döner

 
id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE updateshows  range date_idx date_idx 7 NULL 648997 Using where 

açıklamak olduğunu, ancak bu sorgu çalıştırmak için 11 saniye sürüyor.

veritabanı MyISAM ve phpMyAdmin tablo 1.0GiB olduğunu söylüyor.

Burada herhangi bir fikir var mı? Düzenlenen

: date_idx endeksleri tarih ve venid sütunlar hem de. Bunlar iki ayrı indeks mi? Venid ve tarihi kapsayan bir anahtarı ekleyerek

+0

Hangi dizinlere sahipsiniz? – Pafjo

+0

Açıklamanız sorgunuz 648997 satırı taramak zorunda olduğunu söylüyor (Muhtemelen dizinleri yeterince verimli kullanmaz. Kolonları ayrı ayrı indekslemiştim). Gerçekte kaç satır döndürülür? – nos

+0

Durum şimdi ne –

cevap

38

sorgu SADECE endeksi kullanmak, böylece endeks seçerken veya tüm alanları kapsadığından emin olun olacaktır. Ayrıca, bir aralık sorgusu olduğu için, sabit olarak sorgulandığından, ilk önce indeksi de içine alacak olmanız gerekir. Sorgu endeksinde ise tamamlamak için gereken tüm bilgileri bu endeks ile

ALTER TABLE events ADD INDEX indexNameHere (venid, date, time); 

: Bu yüzden oluşturmak ve dizin şöyle olacaktır. Bu, umarız ki, depolama motoru, gerçekte masanın içinde arama yapmaksızın bilgiyi alabilir. Ancak, MyISAM bunu yapamazdı, çünkü verileri indekslerin yapraklarında saklamıyor, böylece istediğiniz hız artışını elde edemeyebilirsiniz. Bu durumda, tablonun bir kopyasını oluşturmaya çalışın ve kopyadaki InnoDB motorunu kullanın. Orada aynı adımları tekrarlayın ve önemli bir hız artışı elde edip edemeyeceğinizi görün. InnoDB , alan değerlerini dizin yapraklarında saklar ve dizinlerin gizlenmesine izin verir.

mysql> EXPLAIN SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date; 

id select_type table type possible_keys  key  [..] Extra 
1 SIMPLE events range date_idx, indexNameHere indexNameHere Using index, Using where 
+4

+1: dizinleri kapsayan önemlidir. Dikkatli indeksler ve dikkatli sorgular ile, 6mm satırlar büyük bir anlaşma değildir. –

+3

AWESOME !! teşekkür ederim. SEÇİLMİŞ alanları endeksle kapatmam gerektiğinin farkında değildim. Endekslenmesi gereken sadece WHERE alanları olduğunu düşündüm. – pedalpete

+1

hatırlarsanız, indeksle yeni sorguda yürütme zamanı kaçtı? –

2

deneyin (veya tersi, ya da her ikisi ...)

+0

'Anahtar eklemek' derken, bir indeksi mi kastediyorsunuz? Girişimi, date_idx öğesinin hem tarih hem de venid alanlarında olduğunu belirtmek için düzenledim. – pedalpete

+0

'time' da isteyeceksiniz, –

+0

Teşekkürler Michael, SELECT alanlarının da endekslenmesi gerektiğini farketmedim. Şerefe. – pedalpete

1

venid sütun üzerinde dizin koyarak deneyin. Eğer emin olmak ne

+0

Girişimi yeni düzenledim, date_idx hem tarih hem de venid alanlarında. Üzgünüm, bunu aslında ben koymadım. – pedalpete

2

Bir 6M satır tablo gayet normal tekniklerle optimize edilmesi mümkün olmalıdır hayal ediyorum: Sorguyu açıklarken

Şimdi, umarım şunları görürsünüz.

Ben size özel bir veritabanı sunucusu olduğunu varsayalım ve bu ram mantıklı bir miktarda vardır (8G minimum söylemek).

Ramlarınızı verimli bir şekilde kullanmak için mysql ayarını yaptığınızdan emin olmak istersiniz. Eğer 32 bit işletim sistemi kullanıyorsanız, yapmayın. MyISAM kullanıyorsanız, anahtar arabelleğinizi ramınızın işaretleyici oranını kullanmak için değil, çok fazla kullanmanız için ayarlayın.

Her durumda, üretim kalitesinde donanım üzerinde tekrarlanan performans testi yapmak istiyorsunuz.

+0

Teşekkürler @MarkR ve çok geç cevap için özür dilerim. Bu, daha önce inşa ettiğim ikinci web sitesiydi, bu yüzden özel db sunucuları ya da bunun gibi bir şey hakkında hiçbir fikrim yoktu. Aynı kutudaki tüm süreçlerde birkaç yıl koştum. Sorun yok, MySQL'in 8 milyon + sıraya ne kadar iyi ölçeklendiğini görünce çok şaşırdım. O noktaya ulaştığında eski verileri arşivlerdim. – pedalpete